spring boot本身就可以将对象转换为json返回,使用MessageConverter的目的,是想让对象转换为json返回的同时,在返回前做一些处理动作。如果没这个需要,可以不加这个设置。
1.引入fastjson(我选用fastjson):
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
2.增加资源文件用作国际化警告信息

3.增加标准信息返回类(这个返回信息很重要,几乎所有功能返回给浏览器的,都是这个类)
public interface ResultCode {
int SUCCESS = 0;
int FAIL = 1;
}
public class ResultDto<T> implements Serializable {
private static final long serialVersionUID = -1L;
private Integer code;
private String msg;
private T data;
public ResultDto() {
}
public ResultDto(Integer code) {
this(code, "", null);
}
public ResultDto(Integer code, T data) {
this(code, "", data);
}
public ResultDto(Integer code, String msg) {
this(code, msg, null);
}
public ResultDto(Integer code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public Integer getCode() {
return this.code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return this.msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return this.data;
}
public void setData(T data) {
this.data = data;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}
4.创建messageConvert类:
public class MessageConverter extends FastJsonHttpMessageConverter {
public MessageConverter() {
super();
}
@Autowired
private MessageSource messageSource;
@Override
protected void writeInternal(Object obj, HttpOutputMessage outputMessage) throws IOException,
HttpMessageNotWritableException {
if (obj instanceof ResultDto) {
ResultDto result = (ResultDto) obj;
if (StringUtils.isBlank(result.getMsg())) {
//如果没有msg,就根据code去找标准msg返回
result.setMsg(
//到messages_zh_CN.properties获取信息
messageSource.getMessage(
String.valueOf(result.getCode()),
new Object[]{},
Locale.SIMPLIFIED_CHINESE)
);
}
super.writeInternal(result, outputMessage);
} else {
super.writeInternal(obj, outputMessage);
}
}
}
5.配置bean:
@Configuration
public class MessageBean {
@Bean("messageSource")
public ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource(){
ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource = new ReloadableResourceBundleMessageSource();
reloadableResourceBundleMessageSource.setBasenames("classpath:i18n/messages/messages");
reloadableResourceBundleMessageSource.setUseCodeAsDefaultMessage(false);
reloadableResourceBundleMessageSource.setDefaultEncoding("UTF-8");
reloadableResourceBundleMessageSource.setCacheSeconds(60);
return reloadableResourceBundleMessageSource;
}
@Bean
public MessageConverter messageConverter(){
MessageConverter messageConverter = new MessageConverter();
//fastjson配置
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.DisableCircularReferenceDetect);
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
//处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
//在convert中添加配置信息.
messageConverter.setSupportedMediaTypes(fastMediaTypes);
messageConverter.setFastJsonConfig(fastJsonConfig);
return messageConverter;
}
}
运行:


如果注释掉 MessageBean类的messageConverter,那请求的信息返回时,就不会经过MessageConverter类,所得结果如下:

看起来也还行。所以配不配制这个MessageConver,看你们自己项目情况而定。
网友评论