# wsy-mvc **Repository Path**: wxquan/wsy-mvc ## Basic Information - **Project Name**: wsy-mvc - **Description**: mvc便捷式处理,统一结果处理。 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2020-11-20 - **Last Updated**: 2021-11-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: MVC ## README

基于AOP的MVC统一返回结果处理

## Maven dependency ``` 0.0.2 com.wangshouyu wsy-mvc ${wsy-mvc.version} ``` ## 统一返回结果 在传统的项目中,处理请求结果需要进行包装处理结果,对原始的代码有一定的入侵。通过mvc进行处理统一的返回结果,减少代码入侵,增强代码可读性! ### 快速入门 #### 启动统一返回结果 只需要在启动类上加@EnableResponseResult即可 ```java @EnableResponseResult @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 配置哪些类需要使用统一返回结果 只要在要在类上加@ResponseBodyResult即可 ```java @ResponseBodyResult @RestController public class ResponseBodyResultController{ } ``` 或者可以通过@RestResultControllerMapping注解来实现整体的返回结果,可以直接免去添加@RequestMapping和@RestController ```java @RestResultControllerMapping("/mvc") public class ResponseBodyResultController{ } ``` #### 指定方法返回统一结果 ```java @ResponseBodyResult @GetMapping(value = "/hello") public Map sayHello(){ Map map = new HashMap<>(); map.put("hello", "world"); return map; } ``` ### 自定义返回结果 `ResponseBodyResultHandler`为统一返回结果的处理接口,系统默认通过`DefaultResponseBodyResultHandler`类来进行实现统一返回结果。您可以自己实现`ResponseBodyResultHandler`接口来进行处理统一返回结果。 ```java package com.wangshouyu.mvc.handler; import com.wangshouyu.mvc.response.DefaultResponseResult; /** * @author 王守钰 * @date 2020年11月20日 13:57 * @description 默认响应结果处理器 */ public class DefaultResponseBodyResultHandler implements ResponseBodyResultHandler{ @Override public Object handle(Object body) { // 重复包装判断 if(body instanceof DefaultResponseResult || body instanceof String){ return body; } return DefaultResponseResult.success(body); } } ``` #### 默认统一返回结果包装类 ```java public class DefaultResponseResult implements Serializable { /** * 响应数据 */ private T data; /** * 响应消息 */ private String message; /** * 响应码 */ private Integer code; /** * 成功状态码 */ public static final Integer SUCCESS_CODE = 200; /** * 成功消息 */ public static final String SUCCESS_MESSAGE = "success"; /** * 失败状态码 */ public static final Integer FAIL_CODE = 500; /** * 失败消息 */ public static final String FAIL_MESSAGE = "fail"; public DefaultResponseResult(T data, String message, Integer code) { this.data = data; this.message = message; this.code = code; } public DefaultResponseResult() { } public static DefaultResponseResult success(T data) { return new DefaultResponseResult(data, SUCCESS_MESSAGE, SUCCESS_CODE); } public static DefaultResponseResult fail(T data) { return new DefaultResponseResult(data, FAIL_MESSAGE, FAIL_CODE); } // …… getter setter 省略 } ``` #### 排除包装结果 ```java if(body instanceof DefaultResponseResult){ return body; } ``` #### 排除默认返回String字符串 系统默认情况下会使用`AbstractMessageConverterMethodProcessor`类中的`writeWithMessageConverters`方法来进行处理返回结果。当处理字符串时,系统默认会使用`StringHttpMessageConverter`来实现转换。当系统调用到下面这行代码时 ```java body = getAdvice().beforeBodyWrite(body, returnType, selectedMediaType, (Class>) converter.getClass(), inputMessage, outputMessage); ``` 系统会将body的类型变为我们自定的包装类,这时就不是String类型了,所以处理的时候会报数据类型转换错误。如果非要转换返回String数据为包装类型的话可以考虑重写`AbstractMessageConverterMethodProcessor`类中的`writeWithMessageConverters`方法,或者在mvc启动时候排除`StringHttpMessageConverter`,如果排除了StringHttpMessageConverter,默认情况下使用jackson的convert会导致字符串加上双引号也需要具体处理。