骆驼版: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的属性(以避免 异常,禁用SerializationFeature.FAIL_ON_EMPTY_BEA
NS))
为什么ProducerTemplate无法解组对指定对象的响应? 怎么能实现这一目标?
修改
我观察到的修复如下: 如果我首先将输出作为字符串然后反序列化它,它就可以工作。
String responseString = producerTemplate.requestBodyAndHeaders(
"http://localhost:8080/api/contact/2345",
null, headers, String.class);
Contact contact = new ObjectMapper().readValue(responseString, Contact.class);
答案 0 :(得分:1)
尝试创建这样的路线:
//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>
答案 1 :(得分:0)
我的答案更多的是拉法尔的组合,以展示如何将他的代码与您的解决方案联系起来以获得理想的结果。感谢Rafal在此示例中设置子路径。
假设:您已经有其他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());
});
单独的路线
JacksonDataFormat jacksonDataFormat = new JacksonDataFormat();
jacksonDataFormat.setUnmarshalType(Contact.class);
from("direct:RetrieveContactRoute")
.to("http://localhost:8080/api/contact/2345")
.unmarshal(jacksonDataFormat);