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,我不明白为什么。

问题部分解决,我会在本站再问第二部分()