我正在研究一个旧的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));
}
}
}
答案 0 :(得分:0)
问题是使用了记录请求的拦截器。 记录请求会导致requestBody为null,所以现在我将在注释中使用Springs AbstractRequestLoggingFilter。