如何在 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>

然后我希望调用此方法 - WebContentInterceptorpublic 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 对我不起作用。