0
点赞
收藏
分享

微信扫一扫

Controller层统一返回----《编码心得》

三次方 2023-01-09 阅读 65


1.Controller规范

主要的内容是就是接口定义里面的内容,你只要遵循里面的规范,controller就问题不大,除了这些,还有另外的几点:

  1. 所有函数返回统一的ResultBean/PageResultBean格式
    原因见我的接口定义这个贴。没有统一格式,AOP无法玩。
  2. ResultBean/PageResultBean是controller专用的,不允许往后传!
  3. Controller做参数格式的转换,不允许把json,map这类对象传到services去,也不允许services返回json、map。
    一般情况下!写过代码都知道,map,json这种格式灵活,但是可读性差,如果放业务数据,每次阅读起来都比较困难。定义一个bean看着工作量多了,但代码清晰多了。
  4. 参数中一般情况不允许出现Request,Response这些对象
    主要是可读性问题。一般情况下。
  5. 不需要打印日志
    日志在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;
}


}

5.运行结果验证

Controller层统一返回----《编码心得》_spring


举报

相关推荐

0 条评论