1.4 SpringBoot Web返回结果设定为统一格式

返回目录

1. 统一返回相同格式的内容

设定的统一的返回格式

public class R extends HashMap<String,Object> {
    public static String RET_CODE = "code"; // 返回码
    public static String RET_MESSAGE = "msg";//返回码对应的说明
    public static String RET_DATA = "data"; // 返回的数据

    public static R error() {
        R r = new R();
        r.put(RET_CODE,1);
        r.put(RET_MESSAGE,"未知异常,请联系管理员");
        return r;
    }

    /**
     * 操作成功返回类
     * @param message 返回的描述
     * @param data  返回的数据
     * @return
     */
    public static R ok(String message,Object data) {
        R r = new R();
        r.put(RET_CODE,0);
        r.put(RET_MESSAGE,message);
        if(data!=null){
            r.put(RET_DATA,data);
        }
        return r;
    }

    public static R okData(Object data) {
        return ok("操作成功",data);
    }

    public static R okMessage(String message) {
        return ok(message,null);
    }

    public R put(String key, Object value) {
        super.put(key, value);
        return this;
    }
}

使用统一的方法返回值来统一格式

@RestController
@RequestMapping("/hello1")
public class Hello1Controller {

    @GetMapping("/t1")
    public R hello1() {
        return R.okData("返回成功的处理内容");
    }

    @GetMapping("/t2")
    public R hello2() {
        Map<String, Object> retMap = new HashMap<>();
        retMap.put("k1", "v1");
        return R.okData(retMap);
    }
}

测试代码(使用idea HttpClient)

### 1.1 统一方法返回值(返回字符串)
GET {{base_url}}/hello1/t1


### 1.2 统一方法返回值(返回对象)
GET {{base_url}}/hello1/t2

2. 优化

使用ResponseBodyAdvice统一处理返回值

@RestControllerAdvice(basePackages = {"com.github.zq84.demo.web"}) // 注意,这里需要添加扫描的包
public class WebResponseHandle implements ResponseBodyAdvice<Object> {
    private static final Logger log = LoggerFactory.getLogger(WebResponseHandle.class);

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> aClass) {
        // 如果接口返回的类型本身就是R那就没有必要进行额外的操作,返回false
        return !returnType.getParameterType().equals(R.class);
    }
    
    private static ObjectMapper objectMapper = new ObjectMapper();
    @Override
    public Object beforeBodyWrite(Object objData, MethodParameter returnType, MediaType mediaType, Class<?
            extends HttpMessageConverter<?>> aClass, ServerHttpRequest request, ServerHttpResponse response) {
        // 返回类型为json,所以String类型不能直接封装,需要进行特殊处理
        if (String.class.equals(returnType.getGenericParameterType())) {
            // 如果返回String,那么肯定是retMessage
            try {
                return objectMapper.writeValueAsString(R.okData(objData));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        /* 如果使用封装类R,那么说明,需要重写处理成功的提示 */
        R r = R.okData(objData);
        if (objData instanceof R) {
            r = (R) objData;
        }
        // 将原本的数据包装在JsonOut中
        return r;
    }
}

优化后不再需要手工封装返回值

@RestController
@RequestMapping("/hello2")
public class Hello2Controller {

    @GetMapping("/t1")
    public String hello1() {
        return "hello world";
    }

    @GetMapping("/t2")
    public Map<String, Object> hello2() {
        Map<String, Object> retMap = new HashMap<>();
        retMap.put("k1", "v1");
        return retMap;
    }
}

优化前后返回内容无区别。

代码地址:https://gitee.com/johnny/learn-demo/tree/master/springboot-demo/boot01-04-common-return

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值