ApacheCamel2.9.2とSpring3.0.6.RELEASEを使用しています。カスタムDataFormatを使用して、Camelメッセージをマーシャリングおよびアンマーシャリングしようとしています。Springを使用してカスタムDataFormatをルートの1つに構成したいと思います。
Apache Camelのドキュメントには、カスタムデータフォーマットをSpringのルートに接続するには、カスタムデータフォーマットを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;
}
}
Javaで次のテストルートを作成し、問題なく機能したため、CustomDataFormatの実装が正しいことを知っています。
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)に変更しても、エラーは修正されませんでした。
コンソールとログファイルの醜い赤いエラーの大きなブロックが正確に魅力的ではないため、なぜこのエラーが発生するのかを知りたいです。
再度、感謝します。