我正在尝试将我的骆驼弹簧(Camel 2.20.2; Spring 4.3.14(配置外部化为application.properties
属性文件。该属性文件具有以下内容:
net.sender1.port = 47000
net.sender1.address = 127.255.255.255
application.properties
文件位于 src/main/resources
中,并通过maven shade-plugin复制到目标罐。
我的骆驼上下文看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="..." xmlns:xsi="..." xmlns:camel="..." xsi:schemaLocation="...">
<bean id="udpSender1" class="com.foo.MyUDPSender">
<constructor-arg type="java.lang.String" value="${net.sender1.address}" />
<constructor-arg type="java.lang.Integer" value="${net.sender1.port}" />
</bean>
<camelContext xmlns="http://camel.apache.org/schema/spring">
...
</camelContext>
</beans>
启动应用程序时,我会收到以下错误:
警告|2018-02-23 09:50:25,324 |[main] class pathxmlapplicationcontext.refresh-在上下文初始化过程中遇到的异常 - 取消刷新尝试:org.springframework.beans.beans.factory.unsatistisfieddepperencexpection cepption exception exception:error Inror Inlun'''uneb bean用名称'udpsender1'udpsender1'在类中定义了'udpsender1'。要键入" java.lang.integer";嵌套异常是java.lang.numberformatexception:对于输入字符串:" $ {net.sender1.port}"org.springframework.beans.factory.unsatistisfieddependendencyenception:错误创建与name'udpsender1'在类路径资源[meta-inf/spring/spring/camel-context.xml]中定义的bean:类型[java.lang.string]到必需的类型[Java.lang.integer]:无法将'java.lang.string'类型的值转换为必需的'java.lang.integer';嵌套异常是java.lang.numberformatexception:对于输入字符串:" $ {net.sender1.port}" 在org.springframework.beans.factory.support.constructorresolver.createargumentarray(constructorresolver.java:723( 在org.springframework.beans.factory.support.constructorresolver.autowireconstructor(constructorresolver.java:189( at org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.autowireconstructor(Abstractautowirecapablebeanfactory.java:1193( 在org.springframework.beans.factory.support.support.abstractautowirecapablebeanfactory.createbeaninstance(Abstractautowirecapablebeanfactory.java:1095( at org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.docreatebean(Abstractautowirecapablebeanfactory.java:513( at org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.createbean(Abstractautowirecapablebeanfactory.java:483( atorg.springframework.beans.factory.support.abstractbeanfactory $ 1.GetObject(AbstractBeanFactory.java:306( at org.springframework.beans.factory.support.defaultsingletonbeanredistry.getsingleton(DefaultSingletonBeanRegistry.java:230( atorg.springframework.beans.factory.support.abstractbeanfactory.dogetbean(AbstractBeanFactory.java:302( at org.springframework.beans.factory.support.abstractbeanfactory.getbean(AbstractBeanFactory.java:197( at org.springframework.beans.factory.support.defaultlistablebeanfactory.preinstantiatiatesingletons(defaultListablebeanfactory.java:761( at org.springframework.context.support.abstractapplicationcontext.finishbeanfactoryinitialization(AbstractApplicationContext.java:867( 在org.springframework.context.support.abstractlicationcontext.refresh(AbstractApplicationContext.java:543( at org.springframework.context.support.classpathxmlapplicationcontext。 在org.springframework.context.support.classpathxmlapplicationcontext。 atrg.apache.camel.spring.main.createdeedefaultapplicationcontext(main.java:222( atrg.apache.camel.spring.main.dostart(main.java:154( atrg.apache.camel.support.servicesupport.start(servicesupport.java:61( 在com.foo.server.main(server.java:19(
看来address
属性是正确解析的,因为它是字符串。这意味着应用程序可以找到属性文件。
有什么方法可以明确定义属性中的类型或Spring XML?
实际上,您的属性文件不是您的应用程序找到的。它正在尝试将字符串字面的字符串" $ {net.sender1.port}"转换为整数,这就是为什么您获得numberFormateXception。
您需要指定PropertyPlaceholder
才能读取外部属性文件。
<bean class="org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer" id="bridgePropertyPlaceholder">
<property name="location" value="classpath:application.properties"/>
</bean>
如果将上述添加到您的应用程序中,则至少应该能够读取实际属性。
您也可以使用construction
<beans ...
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="...
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
">
<context:property-placeholder properties-ref="properties"/>
<util:properties id="properties" location="classpath:application.properties"/>
</beans>