Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache Camel:ProducerTemplate未对响应进行解组_Java_Apache Camel - Fatal编程技术网

Java Apache Camel:ProducerTemplate未对响应进行解组

Java Apache Camel:ProducerTemplate未对响应进行解组,java,apache-camel,Java,Apache Camel,驼色版本:2.15.6 我使用ProducerTemplate发送http请求并获得如下响应 from("direct:getContact") .process(new Processor() { @Override public void process(Exchange exchange) throws Exception { CamelContext conte

驼色版本:2.15.6

我使用ProducerTemplate发送http请求并获得如下响应

from("direct:getContact")
.process(new Processor() {
                    @Override
                    public void process(Exchange exchange) throws Exception {
                        CamelContext context = exchange.getContext();
                        ProducerTemplate producerTemplate = context.createProducerTemplate();
Contact contact = producerTemplate.requestBodyAndHeaders( 
                                "http://localhost:8080/api/contact/2345", 
                                null, headers, Contact.class); 

logger.info("Contact is: " + new ObjectMapper().writeValueAsString(contact)); 

exchange.getOut().setBody(contact);

});
我得到的联系人为空

当我尝试将其作为如下对象:

Object contact = producerTemplate.requestBodyAndHeaders( 
                                "http://localhost:8080/api/contact/2345", 
                                null, headers); 


logger.info("Contact is: " + new ObjectMapper().writeValueAsString(contact)); 
com.fasterxml.jackson.databind.JsonMappingException:无序列化程序 为班级找到 org.apache.camel.converter.stream.CachedOutputStream$WrappedInputStream 并且没有发现创建BeanSerializer的属性(以避免 异常,在\u EMPTY\u BEA上禁用SerializationFeature.FAIL\u

NS))

为什么ProducerTemplate无法解组对指定对象的响应? 如何做到这一点

编辑

我观察到的修正如下: 如果我首先以字符串的形式获取输出,然后对其进行反序列化,它就会工作

String responseString = producerTemplate.requestBodyAndHeaders( 
                                    "http://localhost:8080/api/contact/2345", 
                                    null, headers, String.class); 

Contact contact = new ObjectMapper().readValue(responseString, Contact.class);

尝试按以下方式创建路线:

//org.apache.camel.component.jackson.JacksonDataFormat

JacksonDataFormat jacksonDataFormat = new JacksonDataFormat();
jacksonDataFormat.setUnmarshalType(Contact.class);

from("direct:getContact")
    .to("http://localhost:8080/api/contact/2345")
    .unmarshal(jacksonDataFormat);
解组后,主体中应该有
Contant
对象

依赖项来自:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jackson</artifactId>
    <version>2.15.6</version>
</dependency>

org.apache.camel
骆驼杰克逊
2.15.6

我的答案更多地是结合了Rafal的方法,以展示如何将他的代码绑定到您的解决方案中,从而获得所需的结果。感谢Rafal在此示例中设置子路线

假设:您已经启动了rest API并可用

您的新代码:

from("direct:getContact")
    .process(new Processor() {
        @Override
        public void process(Exchange exchange) throws Exception {
            CamelContext context = exchange.getContext();
            ProducerTemplate producerTemplate = context.createProducerTemplate();
            //Call another route not the rest endpoint
            Future<Contact> contact = producerTemplate.requestBodyAndHeaders( 
                "direct:RetrieveContactRoute", 
                 null, headers, Contact.class); 

             logger.info("Contact is: " + new ObjectMapper().writeValueAsString(contact.get())); 

             //Set the In Body not the Out Body 
             exchange.getIn().setBody(contact.get());
    }); 

您正在请求您自己的驼峰路线吗?我正在请求联系服务REST API,它是同一台计算机上托管的另一个服务。您如何创建
producerTemplate
?在没有任何路线的情况下使用CamelContext?哦,好的。我只添加了一小部分。请查看更新的问题。我已经添加了完整的路线。我正在处理器内部使用ProducerTemplate,我想对返回的联系人做更多的事情。谢谢Rafal。这个很好用。但是,正如我所说的,我想在处理器中做更多的工作。我想到的是并行请求多个RESTAPI,并创建一个批量响应,我可以从路由返回该响应。例如,获取联系人信息,获取联系人参加的活动,获取他的地址等。我正在查看ProducerTemplate.asyncRequestBody API,它将返回一个未来的对象。我想用它来并行发出请求并等待未来的对象。但是,我在解组问题上被卡住了。你应该在途中做。为此使用一些异步组件。然后您仍然可以使用
unmarshal
method.ProducerTemplate.asyncRequestBody API是我能找到的唯一一个非常适合我需要的异步API。我还提出了一个问题:你有没有其他选择?我发现对于我的用例来说,类似“拆分器和聚合器”的模式是一种过分的杀伤力。
JacksonDataFormat jacksonDataFormat = new JacksonDataFormat();
jacksonDataFormat.setUnmarshalType(Contact.class);

from("direct:RetrieveContactRoute")
    .to("http://localhost:8080/api/contact/2345")
    .unmarshal(jacksonDataFormat);