簡體   English   中英

Apache Camel when deserializing an object, it throws an exception: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM