Java 使用ApacheCamel将MyObject传递给bean路由的可能性?

Java 使用ApacheCamel将MyObject传递给bean路由的可能性?,java,apache-camel,Java,Apache Camel,我正在使用ApacheCamel JAVA DSL使用来自ApacheKafka的消息。 我通过将对象转换为卡夫卡上的字节[]来编写对象。当我使用它时,我会收到一条带有字节[]的消息。我反序列化它并得到一个对象 我检查它是否是MyObject的对象,然后需要使用JavaDSL.to()将其传递给bean。我的代码如下: public class KafkaRouter extends RouteBuilder { private MessageBean msgBean;

我正在使用ApacheCamel JAVA DSL使用来自ApacheKafka的消息。 我通过将对象转换为卡夫卡上的
字节[]
来编写对象。当我使用它时,我会收到一条带有
字节[]
的消息。我反序列化它并得到一个对象

我检查它是否是
MyObject
的对象,然后需要使用JavaDSL
.to()
将其传递给bean。我的代码如下:

public class KafkaRouter extends RouteBuilder {
    
    private MessageBean msgBean;
    
    @Override
    public void configure() throws Exception {
        
        from("{{kafka.cons.uri}}").process(new Processor() {
            
            
            
            @Override
            public void process(Exchange exchange) throws Exception {
                Object obj = SerializationUtils.deserialize(exchange.getIn().getBody(byte[].class));                //TODO cast to specific class as returned after deserialization.
                
                if(obj !=null && obj instanceof MessageBean){
                    
                    msgBean = (MessageBean)obj;
                    
                }
                else {
                    
                    throw new PTFException("Invalid Message read in Kafka Consumer");
                }
                
            }
            
            
        }).bean(PTFTransformerService.class,"callTransformerService(msgBean)"); ;
    }
现在的问题是,我只想在相应的被调用方法中使用
MyObject
,而不想使用
typeconverter
。我不想在方法中获取Exchange/body,我将在进程中处理我的流,如果读取无效消息并且不将其转发给bean,则抛出异常

另一方面,我的方法是:

private void callTransformerService(MessageBean msgObj){
    // Got my object here ;-)   
        
    }

在函数参数前添加
@Body

import org.apache.camel.Body;

private void callTransformerService(@Body MessageBean msgObj){

}

在函数参数前添加
@Body

import org.apache.camel.Body;

private void callTransformerService(@Body MessageBean msgObj){

}

您可能需要编写一个自定义回退类型转换器,该转换器可以从kafka字节[]转换为POJO


然后您可以在bean中定义pojo类型,Camel将使用回退类型转换器尝试转换为pojo类型。

您可能需要编写一个自定义回退类型转换器,该转换器可以从kafka字节[]转换为pojo


然后您可以在bean中定义pojo类型,Camel将使用回退类型转换器尝试转换为pojo类型。

您可以在处理器中设置Exchange主体,如下所示:

msgBean = (MessageBean)obj;
exchange.getIn().setBody(msgBean, MessageBean.class);
void callTransformerService(@Body MessageBean msgObj) {}

您可以在处理器中设置Exchange主体,如下所示:

msgBean = (MessageBean)obj;
exchange.getIn().setBody(msgBean, MessageBean.class);
void callTransformerService(@Body MessageBean msgObj) {}


以及如何编写这段代码“bean(ptftTransformerService.class,“callTransformerService(msgBean)”;“顺便说一句,更改为您所说的不起作用。请尝试不使用括号,只使用方法名称:bean(ptftTransformerService.class,“callTransformerService”);或bean(新的ptftTransformerService(),“callTransformerService”);这也行不通。如果我将exchange body设置为一个可以工作的对象,但我不希望这样做。只需要将对象传递给一个方法。好的,我以前不理解你的代码。我认为这样做是行不通的,因为您只能从exchange传递给bean方法somethink,所以必须设置body或header(如果您不想更改body),并使用简单的语言将该header传递给您的方法:exchange.getIn().setHeader(“headerName”,msgBean)。bean(ptftTransformerService.class,“callTransformerService(${header.headerName})”或exchange.getIn().setBody(msgBean)。bean(ptftTransformerService.class,“callTransformerService”)以及您如何编写这段代码“bean(ptftTransformerService.class,“callTransformerService(msgBean)”;“顺便说一句,更改为您所说的不起作用。尝试不使用括号,只使用方法名称:bean(ptftTransformerService.class,“callTransformerService”);或bean(新的ptftTransformerService(),“callTransformerService”);这也行不通。如果我将exchange body设置为一个可以工作的对象,但我不希望这样做。只需要将对象传递给一个方法。好的,我以前不理解你的代码。我认为这样做是行不通的,因为您只能从exchange传递给bean方法somethink,所以必须设置body或header(如果您不想更改body),并使用简单的语言将该header传递给您的方法:exchange.getIn().setHeader(“headerName”,msgBean)。bean(ptftTransformerService.class,“callTransformerService(${header.headerName})”或exchange.getIn().setBody(msgBean)。bean(ptftTransformerService.class,“callTransformerService”),但这涉及到在某些路径上添加一个TypeConverter文件,并在META-INF文件中提供我觉得不舒服的包列表。。为什么camel不提供一种简单地将对象传递给bean方法的方法呢?当然可以,只需使用java.lang.object作为类型。我建议您学习更多关于Camel的知识,例如关于bean组件/bean参数绑定。你可以阅读CiA2书的免费第4章或浏览骆驼网站文档-谢谢克劳斯,我明白你的意思了。但若你们看到我的代码,我希望传递我在从exchange中读取Body后创建的myObject。现在,如果不使用类型转换器,我可以像“bean(ptftTransformerService.class,“callTransformerService(myObject)”;”那样传递它了吗我知道我可以使用Body并设置任何类型的对象,然后在另一部分使用@Body。但这涉及到在某个路径上添加一个TypeConverter文件,并在META-INF文件中提供我感觉不舒服的包列表。。为什么camel不提供一种简单地将对象传递给bean方法的方法呢?当然可以,只需使用java.lang.object作为类型。我建议您学习更多关于Camel的知识,例如关于bean组件/bean参数绑定。你可以阅读CiA2书的免费第4章或浏览骆驼网站文档-谢谢克劳斯,我明白你的意思了。但若你们看到我的代码,我希望传递我在从exchange中读取Body后创建的myObject。现在,如果不使用类型转换器,我可以像“bean(ptftTransformerService.class,“callTransformerService(myObject)”;”那样传递它了吗我知道我可以使用Body并设置任何类型的对象,然后在另一个部分上使用@Body。您需要在上面的处理方法中使用msgBean替换旧的Body,例如exchange.getIn().setBody(msgBean);谢谢这就是我最后所做的。在上面的处理方法中,您需要用msgBean替换旧的主体,例如exchange.getIn().setBody(msgBean);谢谢这就是我最后做的。