【问题标题】:Concatenate string in spring xml configuration在spring xml配置中连接字符串
【发布时间】:2012-01-04 07:45:37
【问题描述】:

我需要将一个 spring bean 的字符串值连接到一个现有的字符串,然后将其设置为另一个 bean 的属性:

<bean id="inet" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetClass"><value>java.net.InetAddress</value></property>
    <property name="targetMethod"><value>getLocalHost</value></property>
</bean>
<bean id="host" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject"><ref local="inet"/></property>
    <property name="targetMethod"><value>getHostName</value></property>
</bean>

此时,我在“主机”bean 中有主机名。我现在需要连接它并将其传递给 publishedEndpointUrl 属性。像这样的:

<jaxws:endpoint 
    id="foo"
    publishedEndpointUrl= "http://" + host + "/Foo" 
    implementor="com.example.v1.foo"
    address="/v1/Foo"/>

这是如何使用spring xml配置完成的?

【问题讨论】:

    标签: java spring jax-ws cxf spring-ws


    【解决方案1】:

    您需要查看PropertyPlaceholderConfigurer。这允许您定义全局属性,它可以来自属性文件,或者在您的情况下,您可以定义一个默认值,在这种情况下它只是一个全局属性。以下将起作用:

    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="systemPropertiesModeName">
            <value>SYSTEM_PROPERTIES_MODE_OVERRIDE</value>
        </property>
        <property name="properties">
            <props>
                <prop key="driver">jdbc.oracle.Driver</prop>
                <prop key="dbname">fred</prop>
            </props>
        </property>
        <property name="locations">
            <list>
                <value>file:properties/application.properties</value>
            </list>
        </property>
    </bean>
    
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName"><value>${driver}</value></property>
      <property name="url"><value>jdbc:${dbname}</value></property>
    </bean>
    

    这意味着您有用于定义数据源的 ${driver} 和 ${dbname} 的默认值。这些值可以在 application.properties 文件中被覆盖,甚至可以作为命令行中的 -D 选项。

    【讨论】:

      【解决方案2】:

      您可以使用Spring-ELfactory-method

      <bean id="localhost" class="java.net.InetAddress" factory-method="getLocalHost" />
      
      <bean id="publishedUrl" class="java.lang.String">
          <constructor-arg value="#{'http://' + localhost.hostName + '/Foo'}" />
      </bean>
      
      <jaxws:endpoint
         ...
         publishedEndpointUrl="#publishedUrl"
         ...
      

      编辑:

      jaxws:endpoint 标记似乎能够通过使用 #beanId 表示法来引用 bean 值,但不喜欢 Spring-EL。所以通过构造一个String bean,我们解决了这个问题,它看起来仍然相当整洁。

      【讨论】:

      • 这是一个聪明的解决方案,但我得到以下异常:org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named '{'http://' + localhost.hostName + '/Foo' }'
      【解决方案3】:

      由于 jaxws:* namespace 不喜欢 Spring EL,另一种方法是声明 EndpointImpl bean,而不是 jaxws:endpoint 对象。 p>

      还有一些工作要做,但正如http://cxf.apache.org/docs/jax-ws-configuration.html 中所指出的,它是命名空间声明使用的实际实现。

      【讨论】:

        【解决方案4】:

        您可以混合使用 propertyplaceholder vars 和 Spring EL:

        <bean id="dataSource" class="xx.xxx.xxxxx.datasource.DataSourceWrapper" destroy-method="close">
        <property name="dataSourceClassName" value="${db.dataSourceClassName}" />
        <property name="username" value="${db.username}" />
        <property name="password" value="${db.password}" />
        <property name="maximumPoolSize" value="${db.maxConnections}" />
        <property name="connectionTimeout" value="${db.connectionTimeout}" />
        <property name="dataSourceProperties">
            <props>
                <prop key="databaseName">${db.databaseName}</prop>
                <prop key="serverName">${db.serverName}#{':'}${db.port}</prop>
            </props>
        </property>
        

        看看 ${db.serverName}#{':'}${db.port} 连接。

        【讨论】:

          猜你喜欢
          • 2011-05-14
          • 2021-04-12
          • 1970-01-01
          • 1970-01-01
          • 2021-10-29
          • 1970-01-01
          • 1970-01-01
          • 2011-12-14
          • 2011-09-15
          相关资源
          最近更新 更多