如何在 Spring 5 Xml 中的 WebContentInterceptor 中设置 cacheControlMappings
How to set cacheControlMappings in WebContentInterceptor in Spring 5 Xml
我想为 Spring MVC 中的几个 URL 添加缓存控制指令(同时设置 public 和 max-age 秒),我想通过 [=38 进行这些更改=] 仅。
我正在尝试设置 org.springframework.web.servlet.mvc.WebContentInterceptor
的地图 属性 cacheControlMappings
,但唯一的问题是 class 的设计没有 setter 属性 的方法。作为解决方法,我使用 org.springframework.beans.factory.config.MethodInvokingBean
.
调用 addCacheMapping
方法
我在spring-mvc-config.xml中的配置如下——
我正在创建一个 CacheControl
bean,如下所示,我通过调试验证了这个 bean 已成功创建,并在应用程序上下文中填充了适当的值。
<bean id="cacheControlFactory" class="org.springframework.http.CacheControl" factory-method="maxAge">
<constructor-arg index="0" value="3600"/>
<constructor-arg index="1">
<value type="java.util.concurrent.TimeUnit">SECONDS</value>
</constructor-arg>
</bean>
<bean id="myCacheControl" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
<ref bean="cacheControlFactory"/>
</property>
<property name="targetMethod">
<value>cachePublic</value>
</property>
</bean>
然后我希望调用此方法 - WebContentInterceptor
的 public void addCacheMapping(CacheControl cacheControl, String... paths)
,它将向映射 cacheControlMappings
.
添加条目
我确认以编程方式调用此方法效果很好,所以如果我从 XML 调用它应该可以正常工作,对吗?但我正在尝试做同样的事情,如下所示,但这对我不起作用,我在最终地图中添加了零个条目。
<bean class="org.springframework.beans.factory.config.MethodInvokingBean">
<property name="targetObject">
<ref bean="webContentInterceptor"/>
</property>
<property name="targetMethod">
<value>addCacheMapping</value>
</property>
<property name="arguments">
<list>
<ref bean="myCacheControl" />
<value>/home</value>
<value>/dp/**</value>
<value>/**/b/*</value>
</list>
</property>
</bean>
为什么上面的 MethodInvokingBean
调用不起作用?我是否以任何方式设置了错误的参数? varargs 是否需要不同的处理方式?我在服务器启动期间也没有看到任何错误。
此外,我知道这个 SO 线程 ( ),其中接受的答案提到在 XML 本身中无法执行此操作。我想通过尝试实施上述解决方案来重新确认这是否正确,但它不起作用,但我不明白为什么。
正如我所怀疑的那样,填充参数的方式存在问题。 spring 注入中的可变参数需要作为显式列表给出,而不是参数重载(就像在 Java 中所做的那样)。
那么调用这种方法的正确方法是-
public void addCacheMapping(CacheControl cacheControl, String... paths)
中spring applicationContext.xml如下-
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
<ref bean="webContentInterceptor"/>
</property>
<property name="targetMethod">
<value>addCacheMapping</value>
</property>
<property name="arguments">
<list>
<ref bean="myCacheControl" />
<list>
<value>/home</value>
<value>/dp/**</value>
<value>/**/b/*</value>
</list>
</list>
</property>
</bean>
如您所见,我现在使用了 MethodInvokingFactoryBean
。不知何故 MethodInvokingBean
对我不起作用。
我想为 Spring MVC 中的几个 URL 添加缓存控制指令(同时设置 public 和 max-age 秒),我想通过 [=38 进行这些更改=] 仅。
我正在尝试设置 org.springframework.web.servlet.mvc.WebContentInterceptor
的地图 属性 cacheControlMappings
,但唯一的问题是 class 的设计没有 setter 属性 的方法。作为解决方法,我使用 org.springframework.beans.factory.config.MethodInvokingBean
.
addCacheMapping
方法
我在spring-mvc-config.xml中的配置如下——
我正在创建一个 CacheControl
bean,如下所示,我通过调试验证了这个 bean 已成功创建,并在应用程序上下文中填充了适当的值。
<bean id="cacheControlFactory" class="org.springframework.http.CacheControl" factory-method="maxAge">
<constructor-arg index="0" value="3600"/>
<constructor-arg index="1">
<value type="java.util.concurrent.TimeUnit">SECONDS</value>
</constructor-arg>
</bean>
<bean id="myCacheControl" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
<ref bean="cacheControlFactory"/>
</property>
<property name="targetMethod">
<value>cachePublic</value>
</property>
</bean>
然后我希望调用此方法 - WebContentInterceptor
的 public void addCacheMapping(CacheControl cacheControl, String... paths)
,它将向映射 cacheControlMappings
.
我确认以编程方式调用此方法效果很好,所以如果我从 XML 调用它应该可以正常工作,对吗?但我正在尝试做同样的事情,如下所示,但这对我不起作用,我在最终地图中添加了零个条目。
<bean class="org.springframework.beans.factory.config.MethodInvokingBean">
<property name="targetObject">
<ref bean="webContentInterceptor"/>
</property>
<property name="targetMethod">
<value>addCacheMapping</value>
</property>
<property name="arguments">
<list>
<ref bean="myCacheControl" />
<value>/home</value>
<value>/dp/**</value>
<value>/**/b/*</value>
</list>
</property>
</bean>
为什么上面的 MethodInvokingBean
调用不起作用?我是否以任何方式设置了错误的参数? varargs 是否需要不同的处理方式?我在服务器启动期间也没有看到任何错误。
此外,我知道这个 SO 线程 (
正如我所怀疑的那样,填充参数的方式存在问题。 spring 注入中的可变参数需要作为显式列表给出,而不是参数重载(就像在 Java 中所做的那样)。
那么调用这种方法的正确方法是-
public void addCacheMapping(CacheControl cacheControl, String... paths)
中spring applicationContext.xml如下-
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
<ref bean="webContentInterceptor"/>
</property>
<property name="targetMethod">
<value>addCacheMapping</value>
</property>
<property name="arguments">
<list>
<ref bean="myCacheControl" />
<list>
<value>/home</value>
<value>/dp/**</value>
<value>/**/b/*</value>
</list>
</list>
</property>
</bean>
如您所见,我现在使用了 MethodInvokingFactoryBean
。不知何故 MethodInvokingBean
对我不起作用。