【问题标题】:How to set cacheControlMappings in WebContentInterceptor in Spring 5 Xml如何在 Spring 5 Xml 的 WebContentInterceptor 中设置 cacheControlMappings
【发布时间】: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


    【解决方案1】:

    正如我所怀疑的,参数的填充方式存在问题。 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 对我不起作用。

    【讨论】:

    • 如何在 下使用这个?我认为所有这些 cacheControl 和 webInterceptor 声明都在它之外
    • 我们可以将外部声明为 ref 的 bean 引用,例如
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2018-02-24
    • 2019-09-13
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2017-08-07
    相关资源
    最近更新 更多