Конкатенация строки в весенней конфигурации xml - PullRequest
8 голосов
/ 23 ноября 2011

Мне нужно объединить строковое значение пружинного компонента в существующую строку, а затем установить его как атрибут другого компонента:

<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>

На этом этапе у меня есть имя хостабоб 'host'.Теперь мне нужно объединить его и передать его в атрибут publEndpointUrl.Примерно так:

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

Как это сделать с помощью конфигурации Spring XML?

Ответы [ 4 ]

17 голосов
/ 23 ноября 2011

Вы можете использовать Spring-EL и factory-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, но не любит Spring-EL.Таким образом, создав бин String, мы обходим это, и он все еще выглядит довольно аккуратно.

3 голосов
/ 23 ноября 2011

Вам нужно взглянуть на 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 в командной строке.

1 голос
/ 20 мая 2015

Вы можете смешивать переменные заполнителя и 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} concat.

1 голос
/ 01 октября 2012

Поскольку jaxws: * namespace не любит Spring EL , альтернативой может быть объявление бина EndpointImpl вместо объекта jaxws:endpoint.

Это еще немного работы, но, как указано в http://cxf.apache.org/docs/jax-ws-configuration.html,, это фактическая реализация, используемая объявлением пространства имен.

...