我正在使用 Apache Camel 2.9.2 和 Spring 3.0.6.RELEASE。我正在尝试使用自定义 DataFormat 来编组和解组 Camel 消息。我想使用 Spring 将我的自定义 DataFormat 配置到我的一条路线中。
Apache Camel 的文档指出,为了将我的自定义数据格式连接到 Spring 中的路由,我只需将我的自定义 DataFormat 声明为 bean 并在我的 Spring 路由中引用它,如下所示:
<marshal>
<custom ref="myCustomDataFormat"/>
</marshal>
http://camel.apache.org/custom-dataformat.html
所以我有以下设置:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
">
<bean id="myCustomDataFormat" class="com.test.CustomDataFormat"/>
<!-- Camel Context -->
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="file:C:/test?initialDelay=4000&delay=1000"/>
<marshal>
<custom ref="myCustomDataFormat"/>
</marshal>
<to uri="file:C:/test2"/>
</route>
</camelContext>
</beans>
但是当我尝试启动 Camel 时,我收到以下令人讨厌的错误:
org.springframework.beans.ConversionNotSupportedException:无法将“com.test.CustomDataFormat”类型的值转换为所需的“org.apache.camel.model.DataFormatDefinition”类型;嵌套异常是 java.lang.IllegalStateException:无法将类型 [com.test.CustomDataFormat] 的值转换为所需类型 [org.apache.camel.model.DataFormatDefinition]:找不到匹配的编辑器或转换策略
我的数据格式定义如下:
package com.test;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.camel.Exchange;
import org.apache.camel.spi.DataFormat;
public class CustomDataFormat implements DataFormat {
/* (non-Javadoc)
* @see org.apache.camel.spi.DataFormat#marshal(org.apache.camel.Exchange, java.lang.Object, java.io.OutputStream)
*/
@Override
public void marshal(Exchange exchange, Object graph, OutputStream stream)
throws Exception {
System.out.println("Marshal");
byte[] bytes = exchange.getContext().getTypeConverter().mandatoryConvertTo(byte[].class, graph);
stream.write(bytes);
}
/* (non-Javadoc)
* @see org.apache.camel.spi.DataFormat#unmarshal(org.apache.camel.Exchange, java.io.InputStream)
*/
@Override
public Object unmarshal(Exchange exchange, InputStream stream)
throws Exception {
System.out.println("Unmarshal");
byte[] bytes = exchange.getContext().getTypeConverter().mandatoryConvertTo(byte[].class, stream);
return bytes;
}
}
我知道我的 CustomDataFormat 实现是正确的,因为我在 Java 中创建了以下测试路线并且它完美地工作
package com.test;
import org.apache.camel.spring.SpringRouteBuilder;
public class TestFormatRoute extends SpringRouteBuilder {
/* (non-Javadoc)
* @see org.apache.camel.builder.RouteBuilder#configure()
*/
@Override
public void configure() throws Exception {
from("file:C:/test?initialDelay=4000&delay=1000").unmarshal(new CustomDataFormat()).to("file:C:/test2");
}
}
我错过了什么?
谢谢
更新
在收到此错误后让 Camel 完全启动后,我难以置信地发现我的自定义数据格式实际上在我创建的路线中确实有效。我不确定哪个进程试图解析我的自定义数据格式并失败,但它显然与解析数据格式以放入我的路由的进程不同。
这解决了数据格式的功能要求,但没有解释为什么我会收到此错误。
我还确认不是我的数据格式的名称 (CustomDataFormat) 导致了问题。将我的 DataFormat 重命名为唯一名称 (MerlinDataFormat) 并不能修复错误。
我仍然想知道为什么我会收到这个错误,因为我的控制台和日志文件中的大块难看的红色错误并不完全吸引人。
再次感谢。