# 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 extends HttpMessageConverter>>) converter.getClass(),
inputMessage, outputMessage);
```
系统会将body的类型变为我们自定的包装类,这时就不是String类型了,所以处理的时候会报数据类型转换错误。如果非要转换返回String数据为包装类型的话可以考虑重写`AbstractMessageConverterMethodProcessor`类中的`writeWithMessageConverters`方法,或者在mvc启动时候排除`StringHttpMessageConverter`,如果排除了StringHttpMessageConverter,默认情况下使用jackson的convert会导致字符串加上双引号也需要具体处理。