常规写法:
Result:
public class Result<T> {
private String errorCode;
private String msg;
private T data;
public Result(){}
public Result(String errorCode,String msg){
this.errorCode = errorCode;
this.msg = msg;
}
public Result(String errorCode,String msg,T data){
this.errorCode = errorCode;
this.msg = msg;
this.data = data;
}
public static Result SUCCESS(){
return new Result("200","SUCCESS");
}
public static <T> Result SUCCESS(T data){
return new Result("200","SUCCESS",data);
}
public static <T> Result FAILED(String errorCode,String msg){
return new Result(errorCode,msg);
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
Controller:
@GetMapping("/t2")
public Result t2(){
return Result.FAILED("100001","t2失败");
}
使用注解:
1. 创建相应结果注解--ResponseResult
@Documented
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ResponseResult {
}
2. 构建Interceptor,Handler 处理@ResponseResult
public class ResponseResultInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(handler instanceof HandlerMethod){
HandlerMethod handlerMethod = (HandlerMethod) handler;
Class<?> clazz = handlerMethod.getBeanType();
Method method = handlerMethod.getMethod();
if (clazz.isAnnotationPresent(ResponseResult.class)){
request.setAttribute(GrobalConfigProperties.RESPONSE_RESULT_ANN,clazz.getAnnotation(ResponseResult.class));
}else {
request.setAttribute(GrobalConfigProperties.RESPONSE_RESULT_ANN,method.getAnnotation(ResponseResult.class));
}
}
return true;
}
}
@Configuration
public class CommonMvcConfigurer implements WebMvcConfigurer {
@Bean
public ResponseResultInterceptor responseResultInterceptor(){
return new ResponseResultInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(responseResultInterceptor());
}
}
- Handler
@ControllerAdvice
public class ResponseResultHandler implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
ResponseResult responseResult = (ResponseResult) request.getAttribute(GrobalConfigProperties.RESPONSE_RESULT_ANN);
return responseResult == null ? false : true;
}
@Override
public Object beforeBodyWrite(Object object, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
if (object instanceof Result){
return object;
}
return Result.SUCCESS(object);
}
}
测试:
@RestController
@ResponseResult
@RequestMapping("/test1")
public class DemoController {
@GetMapping("/t1")
public void t1(){
}
@GetMapping("/t2")
public Result t2(){
return Result.FAILED("100001","t2失败");
}
@GetMapping("/t3")
public List t3(){
List<String> list = new ArrayList();
list.add("1");
list.add("2");
return list;
}
}