0
我正在研究一箇舊的Spring應用程序,其中包含許多需要生存的遺留代碼。現在我正在研究更現代的API使用方法,並且我偶然發現了一個問題。Spring MVC - 添加GsonHttpMessageConverter導致空@ResponseBody對象
我添加了GSON,用於轉換不同格式和前端的日期(見下文)。但是這在運行時會導致問題,@ResponseBody對象變爲空。
它在MockMVC中正常工作,它掛接了配置,但在運行時在Tomcat 8中,它有問題。由於我一直在搜索這個網頁很長一段時間,似乎它也可能是一個問題,因爲傑克遜也試圖解析JSON。
任何想法如何確保只有GSON用於JSON請求? (我的請求只包含簡單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個'HttpMessageConverter',因爲當您使用'configureMessageConverters'時,這意味着您想使用手動配置的轉換器。基本上傑克遜不會參加比賽。 –
我剛剛發現我的問題可能是由我的日誌記錄攔截器造成的,它正在輸出請求正文,這使得Controller無法訪問正文,感謝那些信息,儘管 –
正確,因爲您只能讀取一次請求,您將不得不復制輸入流。另外Spring已經有一個Filterto記錄請求,它已經爲你做了這個。檢查'AbstractRequestLoggingFIlter'及其子類。 –