Comment définir cacheControlMappings dans WebContentInterceptor dans Spring 5 Xml
Je souhaite ajouter une directive de contrôle du cache (définir à la fois public et max-age seconds) pour quelques URL dans Spring MVC et je souhaite effectuer ces modifications via applicationContext.xml uniquement.
J'essaye de définir la propriété map cacheControlMappingsde org.springframework.web.servlet.mvc.WebContentInterceptor, mais le seul problème est la conception de la classe qui n'a pas de méthode setter pour la propriété. Pour contourner le problème, j'invoque la addCacheMappingméthode à l'aide du org.springframework.beans.factory.config.MethodInvokingBean.
Ma configuration dans spring-mvc-config.xml est la suivante - Je crée un CacheControlbean comme suit, et j'ai vérifié en déboguant que ce bean est créé avec succès avec les valeurs appropriées renseignées dans le contexte de l'application.
<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>
Ensuite , je voudrais invoquer cette méthode - public void addCacheMapping(CacheControl cacheControl, String... paths)de WebContentInterceptorqui ajouter des entrées à la carte cacheControlMappings.
J'ai vérifié que l'appel de cette méthode fonctionne très bien par programme, donc cela devrait fonctionner correctement si je l'invoque à partir du XML, n'est-ce pas? Mais j'essaie de faire la même chose, comme indiqué ci-dessous, mais cela ne fonctionne pas pour moi et je n'ai aucune entrée ajoutée à la carte finale.
<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>
Pourquoi l'invocation ci-dessus MethodInvokingBeanne fonctionne-t-elle pas? Est-ce que je mets les arguments de manière erronée? Les varargs ont-ils besoin d'une manipulation différente? Je ne vois aucune erreur générée non plus lors du démarrage du serveur.
De plus, je suis au courant de ce fil SO ( Comment définir Cache-control: private avec applicationContext.xml dans Spring 4.2 ou version ultérieure ) où la réponse acceptée mentionne qu'il n'y a aucun moyen de le faire dans le XML lui-même. Je voulais reconfirmer si cela est correct en essayant d'implémenter la solution ci-dessus, mais cela ne fonctionne pas, mais je ne vois pas pourquoi.
Réponses
Comme je l'avais soupçonné, il y avait un problème dans la façon dont les arguments étaient alimentés. Les varargs dans une injection de ressort doivent être donnés sous forme de liste explicite au lieu d'une surcharge d'arguments (comme c'est fait en Java).
Donc, la bonne façon d'invoquer une telle méthode -
public void addCacheMapping(CacheControl cacheControl, String... paths)
au printemps applicationContext.xml est comme suit -
<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>
Comme vous pouvez le voir, je l'ai maintenant utilisé MethodInvokingFactoryBean. D'une manière ou d'une autre, cela MethodInvokingBeann'a pas fonctionné pour moi.