Spring MVC - 添加GsonHttpMessageConverter会导致Null @ResponseBody对象

时间:2016-02-29 08:12:56

标签: json spring spring-mvc gson

我正在研究一个旧的Spring应用程序,它包含许多需要生存的遗留代码。现在我正在研究一种更现代的API使用方法,并且我偶然发现了一个问题。

我已经添加了GSON来转换不同格式和前端的日期(见下文)。但这会在运行时导致问题,@ ResponsePody对象变空。

这一切在MockMVC中工作正常,它连接配置,但在运行时在Tomcat 8中,它有问题。由于我一直在谷歌上搜索这段时间,因此杰克逊试图解析JSON也可能是一个问题。

我知道如何才能确保只有GSON用于JSON请求? (我的请求只包含带有Date,String和Long对象的Simple Pojo),但可以有一些嵌套对象。

一些代码段:

WebConfig:

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new RestLoggingInterceptor());
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new ExtendedGsonHttpMessageConverter());
    }
}

ExtendedGsonHttpMessageConverter

public class ExtendedGsonHttpMessageConverter extends GsonHttpMessageConverter
{
    private static final String[] DATE_FORMATS = new String[] {
            "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
            "yyyy-MM-dd'T'HH:mm:ss.SSSZ",
            "yyyy-MM-dd'T'HH:mmZ",
            "yyyy-MM-dd'T'HH:mm:ssZ",
            "yyyy-MM-dd'T'HH:mm:ss-'07:00'"
    };


    public ExtendedGsonHttpMessageConverter()
    {
        super();
        super.setGson(buildGson());
    }
    protected static Gson buildGson() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(Date.class, new DateDeserializer());
        return gsonBuilder.create();
    }

    private static class DateDeserializer implements JsonDeserializer<Date> {

        @Override
        public Date deserialize(JsonElement jsonElement, Type typeOF,
                                JsonDeserializationContext context) throws JsonParseException {
            for (String format : DATE_FORMATS) {
                try {
                    return new SimpleDateFormat(format, Locale.GERMANY).parse(jsonElement.getAsString());
                } catch (ParseException e) {
                }
            }
            throw new JsonParseException("Unparseable date: \"" + jsonElement.getAsString()
                    + "\". Supported formats: " + Arrays.toString(DATE_FORMATS));
        }
    }
}

1 个答案:

答案 0 :(得分:0)

问题是使用了记录请求的拦截器。 记录请求会导致requestBody为null,所以现在我将在注释中使用Springs AbstractRequestLoggingFilter。