2 votes

Utilisation des arguments de constructeur avec Spring cache:annotation-driven

Je reçois l'exception suivante lorsque j'ajoute cache:annotation-driven à mon contexte d'application :

Superclass has no null constructors but no arguments were given

J'ai une classe appelée PersistController qui a des méthodes annotées avec @Cachable(..) et je déclare une instance dans le contexte de l'application comme suit :

<!-- The culprit, for whatever reason -->
<cache:annotation-driven />

<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
    <property name="caches">
        <set>
            <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="primaryTest"/>
            <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="secondaryTest"/>
        </set>
    </property>
</bean>

<!-- The problem began when I started requiring a String in the constructor. -->
<bean id="persistController" class="com.sei.poc.controller.PersistController" >
    <constructor-arg> <value>${cache.nextVersionPostfix}</value></constructor-arg>  
</bean>

Lorsque je retire le cache:annotation-driven l'erreur disparaît et je reçois à la place une erreur indiquant que les composants de mise en cache annotés ne fonctionnent pas (évidemment). Cela signifie que les PersistController déclaré ci-dessus est déclaré correctement et Spring est tout à fait capable d'appeler le constructeur approprié, de résoudre la propriété et d'injecter la chaîne en tant qu'argument.

Alors pourquoi l'erreur quand j'ajoute cache:annotation-driven ?

Je pense que cela a quelque chose à voir avec le fait que Spring instancie automatiquement une instance des classes avec @Cacheable(..) ou l'une des annotations de cache de Spring. Si c'est le cas, j'aimerais savoir s'il existe un moyen de spécifier ma propriété comme argument dans sa construction.

Si je ne peux pas déclarer de constructeurs pour ces classes (et si vous connaissez la réponse, je supposerai que vous comprenez mieux que moi le flux du contexte du printemps), est-ce qu'une classe de type @Autowired o @Value(..) permet à la classe générée de détecter la propriété ?

Merci à tous d'avoir lu.

0voto

Mac Points 451

J'ai trouvé une réponse à la deuxième partie de ma question, à savoir si oui ou non une @Value() sera résolue lorsque Spring chargera la classe avec l'option cache:annotation-driven .

La réponse est oui, j'avais ajouté la ligne suivante dans mon fichier PersistController et le problème a été résolu :

@Value("${cache.currentVersionPostfix}")
private String keyPostfix;

Je ne sais toujours pas si je peux fournir un argument dans un constructeur chargé de cache:annotation-driven . Cela étant dit, je n'accepterai pas cette réponse comme une réponse et j'en accepterai une qui réponde à cette question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X