我需要将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>
此时,我在“主持人”中拥有主机名。豆。我现在需要连接它并将它传递给publishedEndpointUrl属性。像这样:
<jaxws:endpoint
id="foo"
publishedEndpointUrl= "http://" + host + "/Foo"
implementor="com.example.v1.foo"
address="/v1/Foo"/>
使用spring xml配置如何完成?
答案 0 :(得分:17)
您可以使用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
表示法引用bean值,但不喜欢Spring-EL。因此,通过构建一个String
bean,我们可以解决这个问题,它仍然看起来相当整洁。
答案 1 :(得分:3)
您需要查看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文件中覆盖这些值,甚至可以在命令行上覆盖这些值。
答案 2 :(得分:1)
由于 jaxws:* namespace 不喜欢 Spring EL ,另一种方法是声明EndpointImpl bean,而不是jaxws:endpoint
对象
这是一些更多的工作,但正如http://cxf.apache.org/docs/jax-ws-configuration.html中所指出的,它是命名空间声明使用的实际实现。
答案 3 :(得分:1)
你可以混合使用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}#{&#39;:&#39;} $ {db.port} concat。