代码之家  ›  专栏  ›  技术社区  ›  David Easley

我可以在Spring EL中使用属性占位符吗?

  •  4
  • David Easley  · 技术社区  · 14 年前

    在升级到Spring3之前,我在我的应用程序上下文.xml文件:

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

    其中${validateRequest)和${validateRequest)引用的属性可能在我的属性文件中定义,也可能没有定义。

    在spring2中,如果属性文件中不存在这些proeprities,则不会调用bean上的setter,因此使用polepayladvalidatinginterceptor中硬编码的默认值。

    升级到Spring 3后,行为似乎有所不同:如果属性文件中不存在属性,则会出现以下异常:

    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)
    

    我试着涉足Spring EL,但以下几点似乎行不通:

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

    始终使用Elvis运算符后的值,即使在proeprites文件中定义了属性。有趣的是语法被接受了。

    有什么建议吗?

    2 回复  |  直到 14 年前
        1
  •  6
  •   skaffman    14 年前

    看来spring3对Elvis操作符的默认值的处理是相当混乱的。这显然已经被修复了(见 SPR-7209

    #{${validateRequest}?:true}
    
        2
  •  3
  •   Costi Ciudatu    12 年前

    在使用占位符configurer解析丢失的属性时,不需要springel为其设置默认值。简单使用 ${validateRequest:true} . “Elvis操作符”不关心占位符的解析,它只依赖占位符配置器提供的任何输入。

    看到了吗 SPR-4785 .