![](/img/trans.png)
[英]Spring Boot com.fasterxml.jackson.core.JsonParseException: Unrecognized token
[英]Apache Camel when deserializing an object, it throws an exception: com.fasterxml.jackson.core.JsonParseException: Unrecognized token
我有一個 rest api 返回一個字符串:
@GetMapping("/api/users")
public String getUsers(){
return "DENIS";
}
我從 apache 駱駝中調用這個 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);
}
});
}
}
如果代碼是這樣的,那么就是反序列化了字符串,但是如果字符串位置是一些object,就一直是null,不會報錯,就是null。 盡管在調試器中可以看到 object 已經到達,它的字段,但駱駝看不到它。
我已經嘗試了很多選擇,但我不明白這是怎么回事。 如果我調用返回 boolean 的 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");
body 必須先轉成 String,然后 String 轉成 User。 如果你試圖立即將 body 變成一個 User,它總是 null,我不明白為什么。
問題已部分解決,我將在此站點上再次詢問第二部分( Apache Camel: I can't get an object out of body and transform it )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.