Apache Camel和Spring的类型转换问题 [英] Type conversion issue with Apache Camel and Spring

查看:182
本文介绍了Apache Camel和Spring的类型转换问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将我的Camel Spring(Camel 2.20.2; Spring 4.3.14)配置外部化为application.properties属性文件.此属性文件具有以下内容:

I'm trying to externalize my Camel Spring (Camel 2.20.2; Spring 4.3.14) configuration into an application.properties property file. This property file has the following content:

net.sender1.port = 47000
net.sender1.address = 127.255.255.255

application.properties文件位于src/main/resources中,并通过maven-shade-plugin复制到目标jar.

The application.properties file resides within src/main/resources and is copied to the target jar by the 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>

启动应用程序时,出现以下错误:

When I start the application, I get the following error:


WARN | 2018-02-23 09:50:25,324 | [main]  ClassPathXmlApplicationContext.refresh  - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'udpSender1' defined in class path resource [META-INF/spring/camel-context.xml]: Unsatisfied dependency expressed through constructor parameter 1: Could not convert argument value of type [java.lang.String] to required type [java.lang.Integer]: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; nested exception is java.lang.NumberFormatException: For input string: "${net.sender1.port}"
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'udpSender1' defined in class path resource [META-INF/spring/camel-context.xml]: Unsatisfied dependency expressed through constructor parameter 1: Could not convert argument value of type [java.lang.String] to required type [java.lang.Integer]: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; nested exception is java.lang.NumberFormatException: For input string: "${net.sender1.port}"
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:723)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193)
    at org.springframework.beans.factory.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)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.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.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
    at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:93)
    at org.apache.camel.spring.Main.createDefaultApplicationContext(Main.java:222)
    at org.apache.camel.spring.Main.doStart(Main.java:154)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at com.foo.Server.main(Server.java:19)

address属性似乎已正确解析,因为它是一个字符串.这意味着应用程序可以找到属性文件.

It seems that the address property is parsed correctly, because it's a String. Which means that the application can find the properties-file.

有什么方法可以在属性或spring xml中显式定义类型?

Is there any way to explicitly define a type in the properties or in the spring xml?

推荐答案

实际上,您的应用程序找不到您的属性文件.它正在尝试将String文字"$ {net.sender1.port}"转换为Integer,这就是为什么出现NumberFormatException的原因.

Your properties-file is, in fact, not found by your application. It is trying to convert the String literal "${net.sender1.port}" to an Integer, which is why you get a NumberFormatException.

您需要指定PropertyPlaceholder才能读取您的外部属性文件.

You need to specify a PropertyPlaceholder in order to read your external properties-file.

<bean class="org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer" id="bridgePropertyPlaceholder">
    <property name="location" value="classpath:application.properties"/>
</bean>

如果将以上内容添加到您的应用程序中,它至少应该能够读取实际属性.

If you add the above to your application it should at least be able to read the actual properties.

这篇关于Apache Camel和Spring的类型转换问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆