問題
在寫返回json格式數(shù)據(jù)的接口時候:
1惜辑、總會需要將Date轉(zhuǎn)換為比如yyyy-MM-dd HH:mm:ss格式的字符串拗秘。
2、也會遇到json返回Long類型數(shù)值到前端失真的問題蹋辅,比如356454813136846848返回到前端后變成了356454813136846850照筑。
解決辦法
當然可以在每個接口中對進行處理,但是這樣每次都進行時間格式化和類型轉(zhuǎn)換厌处,太麻煩了鳖谈。
下面介紹用MappingJackson2HttpMessageConverter轉(zhuǎn)換器對其進行統(tǒng)一處理。在配置類WebConfig中分別定義日期格式轉(zhuǎn)換器和long轉(zhuǎn)字符串的轉(zhuǎn)換器阔涉,并且在configureMessageConverters方法中將其加入到轉(zhuǎn)換器列表:
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new ByteArrayHttpMessageConverter());
converters.add(new StringHttpMessageConverter());
converters.add(new ResourceHttpMessageConverter());
converters.add(new AllEncompassingFormHttpMessageConverter());
converters.add(new StringHttpMessageConverter());
converters.add(jackson2HttpMessageConverter());
}
/**
* 時間格式轉(zhuǎn)換器,將Date類型統(tǒng)一轉(zhuǎn)換為yyyy-MM-dd HH:mm:ss格式的字符串
* @author 北北
* @date 2017年9月10日上午9:33:06
* @return
*/
@Bean
public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
converter.setObjectMapper(mapper);
return converter;
}
/**
* 返回json時候?qū)ong類型轉(zhuǎn)換為String類型的轉(zhuǎn)換器
* @author 北北
* @date 2017年9月10日上午9:33:06
* @return
*/
@Bean
public MappingJackson2HttpMessageConverter longToStringConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
mapper.registerModule(simpleModule);
converter.setObjectMapper(mapper);
return converter;
}
}
去測試時候就會發(fā)現(xiàn)缆娃,只有先加入的轉(zhuǎn)換器生效,后加入的那個沒有效果瑰排,怎么辦呢贯要?
后來想到了一個解決辦法,就是將兩個方法合并起來椭住,最終代碼如下:
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new ByteArrayHttpMessageConverter());
converters.add(new StringHttpMessageConverter());
converters.add(new ResourceHttpMessageConverter());
converters.add(new AllEncompassingFormHttpMessageConverter());
converters.add(new StringHttpMessageConverter());
converters.add(jackson2HttpMessageConverter());
}
/**
* 時間格式轉(zhuǎn)換器,將Date類型統(tǒng)一轉(zhuǎn)換為yyyy-MM-dd HH:mm:ss格式的字符串
* @author 北北
* @date 2017年9月10日上午9:33:06
* @return
*/
@Bean
public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
//日期格式轉(zhuǎn)換
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//Long類型轉(zhuǎn)String類型
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
mapper.registerModule(simpleModule);
converter.setObjectMapper(mapper);
return converter;
}
}