1.Controller规范
主要的内容是就是接口定义里面的内容,你只要遵循里面的规范,controller就问题不大,除了这些,还有另外的几点:
- 所有函数返回统一的ResultBean/PageResultBean格式
原因见我的接口定义这个贴。没有统一格式,AOP无法玩。 - ResultBean/PageResultBean是controller专用的,不允许往后传!
- Controller做参数格式的转换,不允许把json,map这类对象传到services去,也不允许services返回json、map。
一般情况下!写过代码都知道,map,json这种格式灵活,但是可读性差,如果放业务数据,每次阅读起来都比较困难。定义一个bean看着工作量多了,但代码清晰多了。 - 参数中一般情况不允许出现Request,Response这些对象
主要是可读性问题。一般情况下。 - 不需要打印日志
日志在AOP里面会打印,而且我的建议是大部分日志在Services这层打印。
2.定义ResponseVO
package com.lys.lys_admin_api.common;
import lombok.Data;
/**
* 统一封装返回数据
*
* @author liuyunshengsir
* @date 2019-08-02 23:10:24
*/
@Data
public class ResponseVO<T> {
private Integer code;
private String msg;
private T data;
private ResponseVO() {
}
private ResponseVO(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
private ResponseVO(Integer code, String msg, T data){
this.code = code;
this.msg = msg;
this.data = data;
}
public static <T> ResponseVO<T> ok() {
return new ResponseVO<>(0, "success");
}
public static <T> ResponseVO<T> ok(T data) {
return new ResponseVO<>(0,"success", data);
}
public static <T> ResponseVO<T> error(String message) {
return new ResponseVO<>(-1, message);
}
public static <T> ResponseVO<T> error(Integer code, String msg) {
return new ResponseVO<>(code, msg);
}
}
3.利用aop处理统一返回
package com.lys.lys_admin_api.common;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import java.lang.annotation.Annotation;
import java.util.Arrays;
/**
* 统一封装响应对象
* @author liuyunshengsir
* @date 2019-08-02 23:10:24
*/
@Slf4j
@RestControllerAdvice
public class ResponseVOWrapAdvice implements ResponseBodyAdvice {
private boolean excludeMethod(String methodName){
String[] array = {""};
return Arrays.asList(array).contains(methodName);
}
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
if(excludeMethod(returnType.getMethod().getName())){
return false;
}
Annotation[] classAnnotations = returnType.getContainingClass().getAnnotations();
for(Annotation annotation : classAnnotations){
if(annotation instanceof RestController){
return true;
}
}
return false;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if(body instanceof byte[] ||body instanceof ResponseVO || body instanceof ResponseEntity){
return body;
}
return ResponseVO.ok(body);
}
}
4.编写controller测试效果
package com.lys.lys_admin_api.module.demo;
import com.lys.lys_admin_api.common.exception.GlobalException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
@RestController
@RequestMapping("api/demo/")
public class DemoController {
@GetMapping(value="/test1")
public Object test1(){
HashMap<String,Object> map = new HashMap<>();
map.put("userId",123);
map.put("wechat","lys20191020");
map.put("comment","返利机器人");
return map;
}
}