2010-06-16 3 views
4

Avant de passer à Spring 3 J'ai eu dans mon fichier applicationContext.xml:Puis-je utiliser un espace réservé de propriété avec Spring EL?

<bean class="com.northgateis.pole.ws.PolePayloadValidatingInterceptor"> 
     <property name="validateRequest" value="${validateRequest}" /> 
     <property name="validateResponse" value="${validateResponse}" /> 
    </bean> 

où $ {validateRequest) et $ {validateRequest) se réfèrent à des propriétés qui peuvent ou ne peuvent pas être définies dans le fichier mes propriétés. Au printemps 2, si ces proeprties n'étaient pas présentes dans le fichier de propriétés, les setters sur le bean n'étaient pas appelés et donc les valeurs par défaut codées en dur dans PolePayloadValidatingInterceptor étaient utilisées.

Après la mise à niveau du printemps 3, il semble que le comportement est différent: Si les propriétés ne sont pas présentes dans le fichier de propriétés que je reçois l'exception suivante:

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener 
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'annotationMapping' defined in class path resource [com/northgateis/pole/ws/applicationContext-ws.xml]: Could not resolve placeholder 'validateRequest' 
at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(PropertyPlaceholderConfigurer.java:272) 
at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:75) 
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:640) 
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:615) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:405) 
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:272) 

J'ai essayé barboter avec le printemps EL mais les éléments suivants doesn « t semblent fonctionner:

<bean class="com.northgateis.pole.ws.PolePayloadValidatingInterceptor"> 
     <property name="validateRequest" value="${validateRequest?:true}" /> 
     <property name="validateResponse" value="${validateResponse?:false}" /> 
    </bean> 

la valeur après que l'opérateur Elvis est toujours utilisé, même lorsque les propriétés sont définies dans le fichier proeprties. Intéressant que la syntaxe soit acceptée.

Des suggestions?

Répondre

6

Il semble que la gestion des valeurs par défaut de Spring 3 avec l'opérateur Elvis soit plutôt cassée. Cela a apparemment été fixé (voir SPR-7209) dans le frais-out-of-the-four Spring 3.0.3, et la syntaxe correcte doit être plutôt baroque:

#{${validateRequest}?:true} 
+2

Regarde l'espoir. Cela fonctionne en effet lorsque la propriété est nulle (c'est-à-dire vide dans le fichier de propriétés) mais aboutit à la même chose "Impossible de résoudre l'espace réservé 'validateRequest'" BeanDefinitionStoreException si la propriété est absente du fichier de propriétés. J'essaierai de rouvrir le SPR-7209 et de voir si l'équipe de Spring acceptera que l'absence soit considérée comme équivalente au blanc. –

3

Il n'y a pas besoin pour le printemps EL pour la mise en une valeur par défaut pour une propriété manquante lors de la résolution avec un configurateur d'espace réservé. Utilisez simplement ${validateRequest:true}. L '"opérateur Elvis" ne s'occupe pas de la résolution des espaces réservés, il dépend simplement de l'entrée fournie par le configurateur.

Voir SPR-4785.

Questions connexes