Spring集成中的JSON映射错误

时间:2015-06-18 08:37:57

标签: jackson spring-boot spring-integration

我已经配置了一个入站HTTP网关,它接受POST请求(JSON)并做功课以返回JSON响应,请求和响应有效负载是相同的POJO。

我为Json转换器创建了bean,如下所示

    @Bean
    public Jackson2ObjectMapperBuilder jacksonBuilder() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.indentOutput(true);
        return builder;
    }

    @Bean
    public List<HttpMessageConverter<?>> getConverters(){

        List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>();
        converters.add(new MappingJackson2HttpMessageConverter(jacksonBuilder().build()));
        return converters;
    }

然后我将它们连接到同一个Java Config类中的gate方式定义,代码如下:

@Bean
    public HttpRequestHandlingMessagingGateway gateway(){

        HttpRequestHandlingMessagingGateway gateway = new HttpRequestHandlingMessagingGateway(true);
        RequestMapping requestMapping = new RequestMapping();
        requestMapping.setMethods(HttpMethod.POST);
        requestMapping.setPathPatterns("/appliance/v1/status");
        requestMapping.setConsumes("application/json");
        requestMapping.setProduces("application/json");
        gateway.setRequestMapping(requestMapping);
        gateway.setRequestChannel(requestChannel());
        gateway.setReplyChannel(replyChannel());
        gateway.setMessageConverters(getConverters());
        return gateway;
    }

我打算转换的POJO非常简单

public class ApplianceStatus {

    private String gatewayId;

    private String applianceId;

    private boolean running;

    public String getGatewayId() {
        return gatewayId;
    }

    public void setGatewayId(String gatewayId) {
        this.gatewayId = gatewayId;
    }

    public String getApplianceId() {
        return applianceId;
    }

    public void setApplianceId(String applianceId) {
        this.applianceId = applianceId;
    }

    public boolean isRunning() {
        return running;
    }

    public void setRunning(boolean running) {
        this.running = running;
    }
}

但是,将Content-Type标头设置为application / json的POST请求返回400,我发送的JSON是

{
    "gatewayId": 1,
    "applianceId": 123,
    "running": false
}

我收到回复

{
  "timestamp" : 1434615561240,
  "status" : 400,
  "error" : "Bad Request",
  "exception" : "org.springframework.http.converter.HttpMessageNotReadableException",
  "message" : "Bad Request",
  "path" : "/appliance/v1/status"
}

和日志

2015-06-18 14:55:30.501 DEBUG 3447 --- [tp1023996917-22] .w.s.m.a.ResponseStatusExceptionResolver : Resolving exception from handler [gateway]: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not deserialize instance of byte[] out of START_OBJECT token
 at [Source: HttpInputOverHTTP@55c2d2c5; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of byte[] out of START_OBJECT token
 at [Source: HttpInputOverHTTP@55c2d2c5; line: 1, column: 1]
2015-06-18 14:55:30.501 DEBUG 3447 --- [tp1023996917-22] .w.s.m.s.DefaultHandlerExceptionResolver : Resolving exception from handler [gateway]: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not deserialize instance of byte[] out of START_OBJECT token
 at [Source: HttpInputOverHTTP@55c2d2c5; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of byte[] out of START_OBJECT token
 at [Source: HttpInputOverHTTP@55c2d2c5; line: 1, column: 1]

1 个答案:

答案 0 :(得分:1)

问题是由于未在网关上设置请求有效负载类型

Review

解决了它。