你可能会有这样的需求,对你的Controller返回值进行一个二次封装,
如下:code是结果码(1、成功,0、失败,2、未登录...),data为携带数据
{"code":"1","data":{"name":"xiaoming","age":"30"}}
在spring中,我们需要实现HandlerMethodReturnValueHandler接口,这并不会有任何问题;
在使用SpringBoot的情况下,SpringBoot对返回值的处理,默认就是HandlerMethodReturnValueHandler,我们写的HandlerMethodReturnValueHandler无法直接生效,
如果非要使用HandlerMethodReturnValueHandler,那么只能想办法替换掉默认的;
针对我们上述提出的需求,只是想对Controller的返回值进行封装,使用ResponseBodyAdvice会更加简单一些,下面几行代码就足够了,
对比于HandlerMethodReturnValueHandler,ResponseBodyAdvice还有一个优势,就是可以指定包名,只处理我们需要的代码。
(需要注意的是返回Controller返回null的场景)
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import java.util.HashMap;
import java.util.Map;
/**
* Created by 12614 on 2018/5/11.
*/
@ControllerAdvice(basePackages = "cn.seaboot")
public class TestResponseAdvice implements ResponseBodyAdvice<Object>{
@Override
public boolean supports(MethodParameter methodParameter,
Class<? extends HttpMessageConverter<?>> aClass) {
return methodParameter.hasMethodAnnotation(ResponseBody.class);
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter,
MediaType mediaType,
Class<? extends HttpMessageConverter<?>> aClass,
ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {
Map<String,Object> res = new HashMap<>();
res.put("code","1");
res.put("data",o);
return res;
}
}