【发布时间】:2020-08-24 11:14:17
【问题描述】:
我想为 Spring MVC 中的几个 URL 添加缓存控制指令(设置 public 和 max-age 秒),我只想通过 applicationContext.xml 进行这些更改。
我正在尝试设置org.springframework.web.servlet.mvc.WebContentInterceptor 的地图属性cacheControlMappings,但唯一的问题是该类的设计没有该属性的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 的调用不起作用?我是否以任何方式错误地设置了参数?可变参数是否需要不同的处理?在服务器启动期间我也没有看到任何错误。
另外,我知道这个 SO 线程 (How to set Cache-control: private with applicationContext.xml in Spring 4.2 or later),其中接受的答案提到在 XML 本身中没有办法做到这一点。我想通过尝试实施上述解决方案来重新确认这是否正确,但它不起作用,但我不明白为什么。
【问题讨论】:
标签: java xml spring spring-mvc cache-control