SPRING统一Response返回
2021-02-01 本文已影响0人
ccccaixiaohao
参考博文:
https://codecoord.blog.csdn.net/article/details/109032687
目前返回结果:
![](https://img.haomeiwen.com/i10745737/4f9c9742761753a6.png)
统一返回结果:
![](https://img.haomeiwen.com/i10745737/6720063535673a22.png)
1.定义基本返回的Result类:
public class BaseResult<T> {
private Integer code;
private String message;
private T data;
private static final Integer SUCCESS_CODE = 0;
private static final Integer FAIL_CODE = 1;
public BaseResult() {
}
public BaseResult(Integer errCode, String message, T data) {
this.code = errCode;
this.message = message;
this.data = data;
}
public static BaseResult<Object> success() {
return new BaseResult(SUCCESS_CODE, (String) null, (Object) null);
}
public static BaseResult<Object> success(String message, Object data) {
return new BaseResult(SUCCESS_CODE, message, data);
}
public static BaseResult<Object> success(Integer errCode, String message, Object data) {
return new BaseResult(errCode, message, data);
}
public static BaseResult<Object> success(Object data) {
return new BaseResult(SUCCESS_CODE, (String) null, data);
}
public static BaseResult<Object> fail(String message) {
return new BaseResult(FAIL_CODE, message, null);
}
public static BaseResult<Object> fail(String message, Object data) {
return new BaseResult(FAIL_CODE, message, data);
}
public static BaseResult<Object> fail(Integer failCode, String message, Object data) {
return new BaseResult(failCode, message, data);
}
public static BaseResult<Object> fail(Object data) {
return new BaseResult(FAIL_CODE, (String) null, data);
}
public Integer getCode() {
return this.code;
}
public String getMessage() {
return this.message;
}
public T getData() {
return this.data;
}
public void setErrCode(Integer code) {
this.code = code;
}
public void setMessage(String message) {
this.message = message;
}
public void setData(T data) {
this.data = data;
}
}
2.定义处理类
将返回结果替换
public class ResponseBodyWrapHandler implements HandlerMethodReturnValueHandler {
private final HandlerMethodReturnValueHandler delegate;
public ResponseBodyWrapHandler(HandlerMethodReturnValueHandler delegate) {
this.delegate = delegate;
}
@Override
public boolean supportsReturnType(MethodParameter methodParameter) {
return delegate.supportsReturnType(methodParameter);
}
@Override
public void handleReturnValue(Object returnValue,
MethodParameter methodParameter,
ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest) throws Exception {
if(!(returnValue instanceof BaseResult)){
returnValue = BaseResult.success(returnValue);
}
delegate.handleReturnValue(returnValue,methodParameter,modelAndViewContainer,nativeWebRequest);
}
}
3.替换原有的处理类
@Component
public class ResponseBodyWrapFactoryBean implements InitializingBean {
private final RequestMappingHandlerAdapter requestMappingHandlerAdapter;
@Autowired
public ResponseBodyWrapFactoryBean(RequestMappingHandlerAdapter requestMappingHandlerAdapter) {
this.requestMappingHandlerAdapter = requestMappingHandlerAdapter;
}
@Override
public void afterPropertiesSet() throws Exception {
List<HandlerMethodReturnValueHandler> returnValueHandlers = requestMappingHandlerAdapter.getReturnValueHandlers();
ArrayList<HandlerMethodReturnValueHandler> handlers = new ArrayList<>(returnValueHandlers);
if(handlers.size() > 0){
decorateHandlers(handlers);
}
requestMappingHandlerAdapter.setReturnValueHandlers(handlers);
}
private void decorateHandlers(List<HandlerMethodReturnValueHandler> handlers){
Iterator<HandlerMethodReturnValueHandler> iterator = handlers.iterator();
while (iterator.hasNext()){
HandlerMethodReturnValueHandler currentHandler = iterator.next();
if(currentHandler instanceof RequestResponseBodyMethodProcessor){
ResponseBodyWrapHandler wrapHandler = new ResponseBodyWrapHandler(currentHandler);
int index = handlers.indexOf(currentHandler);
handlers.set(index,wrapHandler);
break;
}
}
}
}
定义注释,跳过统一封装
4.注释类
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IgnoreResponseWarpper {
}
5.在处理时跳过注释标记过的方法或类
@Override
public void handleReturnValue(Object returnValue,
MethodParameter methodParameter,
ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest) throws Exception {
IgnoreResponseWarpper ignoreAnnotation = methodParameter.getDeclaringClass().getAnnotation(IgnoreResponseWarpper.class);
if(ignoreAnnotation != null){
delegate.handleReturnValue(returnValue,methodParameter,modelAndViewContainer,nativeWebRequest);
return;
}
ignoreAnnotation = methodParameter.getMethodAnnotation(IgnoreResponseWarpper.class);
if(ignoreAnnotation != null){
delegate.handleReturnValue(returnValue,methodParameter,modelAndViewContainer,nativeWebRequest);
return;
}
if(!(returnValue instanceof BaseResult)){
returnValue = BaseResult.success(returnValue);
}
delegate.handleReturnValue(returnValue,methodParameter,modelAndViewContainer,nativeWebRequest);
}