Apache Camel 在反序列化对象时抛出异常:com.fasterxml.jackson.core.JsonParseException: Unrecognized token
Apache Camel when deserializing an object, it throws an exception: com.fasterxml.jackson.core.JsonParseException: Unrecognized token
我休息api那个returns一个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);
}
});
}
}
如果代码是这样的话,那么这个字符串就是反序列化的,但是如果这个字符串所在的位置是某个对象,那么它永远是null,不会有错误,就是null。虽然在调试器中可以看到对象已经到达,它的字段,但是骆驼看不到它。
我已经尝试了很多选项,但我不明白这是怎么回事。如果我将 api 称为 returns 布尔值,并且我接受它,那么一切正常,但它不适用于对象和字符串。
我该如何解决这个问题?可能是什么原因?我已经尝试过使用依赖项,但没有结果。
非常感谢你的帮助
第一个案子是这样判的:
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");
body必须先转成String,再转成User。
如果你试图立即将 body 变成一个 User,它将永远是 null,我不明白为什么。
问题部分解决,我会在本站再问第二部分()
我休息api那个returns一个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);
}
});
}
}
如果代码是这样的话,那么这个字符串就是反序列化的,但是如果这个字符串所在的位置是某个对象,那么它永远是null,不会有错误,就是null。虽然在调试器中可以看到对象已经到达,它的字段,但是骆驼看不到它。
我已经尝试了很多选项,但我不明白这是怎么回事。如果我将 api 称为 returns 布尔值,并且我接受它,那么一切正常,但它不适用于对象和字符串。
我该如何解决这个问题?可能是什么原因?我已经尝试过使用依赖项,但没有结果。
非常感谢你的帮助
第一个案子是这样判的:
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");
body必须先转成String,再转成User。 如果你试图立即将 body 变成一个 User,它将永远是 null,我不明白为什么。
问题部分解决,我会在本站再问第二部分(