Apache Camel在反序列化对象时抛出一个异常:com.fasterxml. jacksoncore . json



我有一个rest api返回一个String:

@GetMapping("/api/users")
public String getUsers(){
return "DENIS";
}

我从apache camel调用这个api:

from("direct:start")
.setHeader(Exchange.HTTP_METHOD).constant(HttpMethod.GET)
.setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
.to("http://localhost:8085/api/users")
.unmarshal().json(JsonLibrary.Jackson, String.class);
val template = DefaultFluentProducerTemplate.on(camelContext);
String a = template.to("direct://" + "start").request(String.class);

这些操作导致这个错误:

com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'DENIS': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
at [Source: (org.apache.camel.converter.stream.CachedOutputStream$WrappedInputStream); line: 1, column: 6]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:2337) ~[jackson-core-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:720) ~[jackson-core-2.12.1.jar:2.12.1]
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._reportInvalidToken(UTF8StreamJsonParser.java:3593) ~[jackson-core-2.12.1.jar:2.12.1]

此外,这里还有一个奇怪的行为:

@Override
public void configure() {
from("timer://test?period=2000")
.setHeader(Exchange.HTTP_METHOD).constant(HttpMethod.GET)
.setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
.to("http://localhost:8085/api/users")
.process(new Processor() {
@Override
public void process(Exchange exchange) {
String body = exchange.getIn().getBody(String.class);
}
});
}
}

如果代码是这样的,那么字符串将被反序列化,但如果字符串位置是某个对象,则它将始终为空,不会出现错误,它将为空。虽然在调试器中可以看到对象已经到达,但camel看不到它的字段。

我已经尝试了很多选择,但我不明白是怎么回事。如果我调用返回布尔值的api,并且我接受它,那么一切都没问题,但它不适用于对象和字符串。

我怎样才能解决这个问题?原因是什么呢?我已经尝试过使用依赖关系,但是没有结果。

我很感激你的帮助

第一个案例决定:

from("direct:start")
.setHeader(Exchange.HTTP_METHOD).constant(HttpMethod.GET)
.setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
.to("http://localhost:8085/api/users")
.unmarshal(new JacksonDataFormat(User[].class));

与帮助JacksonDataFormat.

第二个选项不能完全解决,情况如下:

from("direct:start")
.setHeader(Exchange.HTTP_METHOD).constant(HttpMethod.GET)
.setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
.to("http://localhost:8085/api/users")
.to("direct:httpClient")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws JsonProcessingException {
String body = exchange.getIn().getBody(String.class);
User[] users = jacksonDataFormat.getObjectMapper().readValue(body, User[].class);
exchange.getIn().setBody(users);
}
})
.to("direct:httpClient");

主体必须先转换为String,然后再转换为User。如果你试图立即将body转换为User,它将永远是null,我不明白为什么。

这个问题已经部分解决了,我将在这个网站上再问第二部分(Apache Camel:我不能't将对象从主体中取出并转换它)

相关内容

最新更新