Java Apache Camel:ProducerTemplate未对响应进行解组
驼色版本:2.15.6 我使用ProducerTemplate发送http请求并获得如下响应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
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);