使用springmvc,所有接口返回统一格式的json数据
首先自定义返回json的注解
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseJsonBody {
}
支持ResponseJsonBody注解的返回值handler
public class ReponseJsonBodyMethodReturnValueHandler implements HandlerMethodReturnValueHandler {
private Logger logger = LoggerFactory.getLogger(getClass());
private List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
public boolean supportsReturnType(MethodParameter returnType) {
return returnType.getMethodAnnotation(ResponseJsonBody.class) != null;
}
public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
this.messageConverters.addAll(messageConverters);
}
@SuppressWarnings({ "resource", "unchecked" })
public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
mavContainer.setRequestHandled(true);
if (returnValue != null) {
HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
ServletServerHttpResponse outputMessage = new ServletServerHttpResponse(response);
Class<?> returnValueClass = returnValue.getClass();
for (HttpMessageConverter<?> messageConverter : messageConverters) {
if (messageConverter.canWrite(returnValueClass, MediaType.APPLICATION_JSON)) {
Object result = returnValue;
if (!(returnValue instanceof JsonResult)) {
result = JsonResultUtils.getJsonResult(returnValue, SystemConstants.RESPONSE_STATUS_SUCCESS, null, null);
}
((HttpMessageConverter<Object>) messageConverter).write(result, MediaType.APPLICATION_JSON, outputMessage);
if (logger.isDebugEnabled()) {
logger.debug("Written [" + returnValue + "] as \"" + MediaType.APPLICATION_JSON + "\" using [" + messageConverter + "]");
}
return;
}
}
}
}
public class CustomizeFastJsonHttpMessageConverter extends FastJsonHttpMessageConverter {
@Override
protected void writeInternal(Object obj, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
Object value = obj;
if (obj != null && !(obj instanceof JsonResult)) {
value = JsonResultUtils.getJsonResult(obj, SystemConstants.RESPONSE_STATUS_SUCCESS, null, null);
}
OutputStream out = outputMessage.getBody();
String text = JSON.toJSONString(value, getFeatures());
byte[] bytes = text.getBytes(getCharset());
out.write(bytes);
}
}
public final class JsonResultUtils {
public static <T> JsonResult<T> getJsonResult(T data, String code, String errorCode, String message) {
JsonResult<T> result = new JsonResult<T>();
result.setCode(code);
result.setErrorCode(errorCode);
result.setData(data);
result.setMessage(message);
result.setTimestamp(DateUtils.DateToStr(new Date()));
return result;
}
}