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

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.运行结果验证

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuyunshengsir

微信:lys20191020

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值