【问题标题】:Using Spring Expression Language to define xml attribute使用 Spring 表达式语言定义 xml 属性
【发布时间】:2013-08-18 09:35:50
【问题描述】:

这是我的问题:我必须读取一个属性 (activemq.connector.port) 并为其添加 2 并使用它在 bean ManagementContext 上设置一个属性 (connectorPort)。这里的属性来自一个文件,或者它可能是系统属性。我想春天并不在乎。

 <amq:broker id="broker" useJmx="true" persistent="true">
       <amq:managementContext createConnector="true" connectorPort="#{${activemq.connector.port}+2}"/>
       <amq:transportConnectors>
           <amq:transportConnector uri="vm://localhost:${activemq.connector.port:1099}"/>
       </amq:transportConnectors>
 </amq:broker> 

当我尝试这样做时,我得到了这个异常。

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named '{1099 + 2 }' is defined
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:568)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1108)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:278)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:323)

我该如何进行这项工作?有没有其他方法可以实现这一目标?

【问题讨论】:

  • 你在用&lt;util:properties&gt;吗?

标签: spring properties spring-el


【解决方案1】:

我遇到了一个非常相似的问题。 我正在使用 Spring 4.2.7.RELEASE 和 ActiveMQ 5.13.4。 我更喜欢 XML 文件来配置 activeMQ,所以我设置了一个 XML 文件,内容如下:

    <persistenceAdapter>
        <kahaDB 
            directory="${activemq.persistence.directory}/KahaDB"
            journalMaxFileLength="#{100*1024*1024}"
            indexWriteBatchSize="100"
            enableIndexWriteAsync="true"
            concurrentStoreAndDispatchQueues="false"
            concurrentStoreAndDispatchTopics="false" />
    </persistenceAdapter>

然后我收到以下错误消息: 原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为“{100*1024*1024}”的bean。

我可以通过在 # 之前添加一个空格来解决此问题。奇怪……好像还有另一种逃生机制。没看懂。

就我而言,我使用更方便的语法“100 Mb”解决了这个问题。

【讨论】:

    【解决方案2】:

    首先尝试一下:“#{2 + ${activemq.connector .port}}”强制 spEL 使用占位符作为数字。

    Else 使用此语法(是 Java 代码 Integer.valueOf(value of 'activemq.connector.port') + 2 的 spEL 表示法):

    #{ T(java.lang.Integer).valueOf('${activemq.connector.port}') + 2 }
    

    可能 ${} 作为字符串而不是数字进行管理,因此需要“强制转换” T(Class).&lt;staticMethod&gt;(params) 是调用静态方法的 spEL 语法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 2012-03-30
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      相关资源
      最近更新 更多