众所周知Spring中内置了大量的HTTPMessageConverter,比如我们常用的MappingJackson2HTTPMessageConverter、StringHTTPMessageConverter等,但因为实际开发的业务需要,我们往往会进行自定义HTTPMessageConverter,例如我们在开发时使用@responseBody修饰接口时往往还需要为返回的数据进行格式化来满足调用方的需要,这里就会产生多余代码和格式统一的问题,如果我们通过自定义消息收发器的话,就可以对返回数据的格式进行统一化,因此在开发时既提高代码的简洁性也提高了前后端交互的效率,本文会为大家演示通过HTTPMessageConverter+FastJson对Request和response的报文进行自定义处理。
首先本消息收发器是为接口式系统的基础上,因此我们需要对REST接口进行格式的统一化
一、定义http返回报文的模板对象
package com.lhm.entity;
import java.io.Serializable;
import java.util.Date;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.lhm.util.CustomDateTimeDeserializer;
import com.lhm.util.CustomDateTimeSerializer;
/**
* Http请求返回报文模板
* @author lhm
* @version 1.0
* @since 2017-9-23
* */
public class ResResult implements Serializable {
/**接口地址*/
private String interfaceUri;
/** 请求状态:true成功, false失败 */
private Boolean status;
/** 返回结果 */
private Object result;
/**异常类型*/
private String exception;
/**异常消息*/
private String msg;
/**发起请求的时间 */
private Date timestamp;
/**耗时长度(单位:毫秒)*/
private int during;
public ResResult() {
super();
}
public ResResult(Boolean status, Date timestamp) {
super();
this.status = status;
this.timestamp = timestamp;
}
public ResResult(String interfaceUri, Boolean status, Date timestamp) {
super();
this.interfaceUri = interfaceUri;
this.status = status;
this.timestamp = timestamp;
}
public Boolean getStatus() {
return status;
}
public void setStatus(Boolean status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@JSONField(format="yyyy-MM-dd HH:mm:ss")
@JsonSerialize(using = CustomDateTimeSerializer.class)
public Date getTimestamp() {
return timestamp;
}
@JsonDeserialize(using = CustomDateTimeDeserializer.class)
public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}
public String getException() {
return exception;
}
public void setException(String exception) {
this.exception = exception;
}
@JSONField(format="yyyy-MM-dd HH:mm:ss")
public int getDuring() {
return during;
}
public void setDuring(int during) {
this.during = during;
}
/**
* 计算请求处理时长 <br/>
* @author lhm
* @date: 2017年6月16日 上午9:29:25
*
* @return void
*/
public void setDuring() {
this.during = (int)(System.currentTimeMillis()-getTimestamp().getTime());
}
public String getInterfaceUri() {
return interfaceUri;
}
public void setInterfaceUri(String interfaceUri) {
this.interfaceUri = interfaceUri;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
}
二、继承FastJson中的FastJsonHttpMessageConverter类并根据业务需要定义信息模板
package com.lhm.converter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableExc