So legen Sie cacheControlMappings in WebContentInterceptor in Spring 5 Xml fest
Ich möchte für einige URLs in Spring MVC eine Cache-Steuerungsanweisung hinzufügen (sowohl öffentliche als auch maximale Sekunden festlegen) und diese Änderungen nur über applicationContext.xml vornehmen.
Ich versuche, die map-Eigenschaft cacheControlMappingsvon festzulegen org.springframework.web.servlet.mvc.WebContentInterceptor, aber das einzige Problem ist das Design der Klasse, für die es keine Setter-Methode für die Eigenschaft gibt. Um dieses Problem zu umgehen, rufe ich die addCacheMappingMethode mithilfe von auf org.springframework.beans.factory.config.MethodInvokingBean.
Meine Konfiguration in spring-mvc-config.xml lautet wie folgt: Ich erstelle eine CacheControlBean wie folgt und habe durch Debuggen überprüft, dass diese Bean erfolgreich mit den entsprechenden Werten erstellt wurde, die im Anwendungskontext angegeben sind.
<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>
Dann möchte ich diese Methode aufrufen - public void addCacheMapping(CacheControl cacheControl, String... paths)von WebContentInterceptorder Einträge zur Karte hinzugefügt werden cacheControlMappings.
Ich habe überprüft, dass das programmgesteuerte Aufrufen dieser Methode hervorragend funktioniert. Es sollte also einwandfrei funktionieren, wenn ich sie über XML aufrufe, oder? Aber ich versuche das Gleiche zu tun, wie unten gezeigt, aber das funktioniert bei mir nicht und ich bekomme keine Einträge zur endgültigen Karte hinzugefügt.
<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>
Warum funktioniert der obige Aufruf mit MethodInvokingBeannicht? Setze ich die Argumente in irgendeiner Weise falsch? Benötigen die Varargs eine andere Handhabung? Ich sehe auch beim Serverstart keine Fehler.
Außerdem ist mir dieser SO-Thread bekannt ( Festlegen der Cache-Steuerung: privat mit applicationContext.xml in Spring 4.2 oder höher ), in dem in der akzeptierten Antwort erwähnt wird, dass dies im XML selbst nicht möglich ist. Ich wollte erneut bestätigen, ob dies korrekt ist, indem ich versuchte, die obige Lösung zu implementieren, aber es funktioniert nicht, aber ich verstehe nicht warum.
Antworten
Wie ich vermutet hatte, gab es ein Problem in der Art und Weise, wie die Argumente bevölkert wurden. Die Varargs in einer Federinjektion müssen als explizite Liste anstelle einer Überladung von Argumenten angegeben werden (wie dies in Java der Fall ist).
Also der richtige Weg, um eine solche Methode aufzurufen -
public void addCacheMapping(CacheControl cacheControl, String... paths)
im Frühjahr applicationContext.xml ist wie folgt -
<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>
Wie Sie sehen, habe ich jetzt verwendet MethodInvokingFactoryBean. Irgendwie MethodInvokingBeanhat es bei mir nicht funktioniert.