与Apache Camel和Spring类型转换问题



我正在尝试将我的骆驼弹簧(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>

最新更新