当反序列化一个对象时,它抛出一个异常:com.fasterxml.jackson.core.jsonparseexception:unrecognized token

ogq8wdun  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(818)

我有一个rest api,它返回一个字符串:

@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。虽然在调试器中可以看到对象已经到达了它的字段,但是camel看不到它。
我已经尝试了很多选择,但我不明白是怎么回事。如果我调用返回boolean的api并接受它,那么一切都正常,但它不能处理对象和字符串。
我怎样才能解决这个问题?原因是什么?我已经尝试过使用依赖项,但是没有结果。
我会感激你的帮助

ocebsuys

ocebsuys1#

第一个案件的判决如下:

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");

必须首先将主体转换为字符串,然后将字符串转换为用户。如果你试图把身体立即变成一个用户,它将永远是空的,我不明白为什么。
问题得到了部分解决,我将在这个站点上再次询问第二部分(apachecamel:我无法从主体中获取对象并对其进行转换)

相关问题