今天又学到了新知识,使用ResponseBodyAdvice实现接口统一返回值。
话不多说直接上代码。
1.我们要有一个统一返回数据类,即我们要返回哪些内容。
package com.youyou.common.http;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 返回消息类
* @param <T>
*/
@Data
public class ResponseMessage<T> {
private static final Logger LOGGER = LoggerFactory.getLogger(ResponseMessage.class);
/**
* 状态码
*/
private String code;
/**
* 状态消息
*/
private String message;
/**
* 返回数据
*/
private T data;
/**
* 是否执行成功
*/
private boolean ok;
public ResponseMessage() {
}
public ResponseMessage(String code, String message) {
this.code = code;
this.message = message;
LOGGER.info(toString());
}
public ResponseMessage(String code, String message, boolean ok) {
this.code = code;
this.message = message;
this.ok = ok;
LOGGER.info(toString());
}
public ResponseMessage(String code, String message, boolean ok, T data) {
this.code = code;
this.message = message;
this.ok = ok;
this.data = data;
LOGGER.info(toString());
}
}
2.一个状态码枚举类
package com.youyou.common.http;
/**
* 错误码枚举类
*/
public enum ResponseMessageErrorCodeEnum {
SUCCESS("0"),
ERROR("-1"),
VALID_ERROR("1000"),
SAVE_SUCCESS("r0001"),
UPDATE_SUCCESS("r0002"),
REMOVE_SUCCESS("r0003");
private String code;
ResponseMessageErrorCodeEnum(String code) {
this.code = code;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
3.一个对象的创建实例类
package com.youyou.common.http;
public class Result {
public static ResponseMessage success() {
return new ResponseMessage(ResponseMessageErrorCodeEnum.SUCCESS.getCode(), "", true);
}
public static <T> ResponseMessage<T> success(String code, T t) {
return new ResponseMessage(code, "", true, t);
}
public static <T> ResponseMessage<T> success(String code, String message, T t) {
return new ResponseMessage(code, message, true, t);
}
public static <T> ResponseMessage<T> success(T t) {
return new ResponseMessage(ResponseMessageErrorCodeEnum.SUCCESS.getCode(), "", true, t);
}
public static ResponseMessage error() {
return error("");
}
public static ResponseMessage error(String message) {
return error(ResponseMessageErrorCodeEnum.ERROR.getCode(), message);
}
public static ResponseMessage error(String code, String message) {
return error(code, message, null);
}
public static <T> ResponseMessage<T> error(String code, String message, T t) {
return new ResponseMessage(code, message, false, t);
}
}
4.首先我们要实现ResponseBodyAdvice接口,并使用@ControllerAdvice注解来实现扫描的包名,
package com.youyou.advice;
import com.alibaba.fastjson.JSON;
import com.youyou.common.http.Result;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
/**
* //TODO 添加类/接口功能描述
*
* @author 刘朋
* <br/>date 2019-10-24
*/
@ControllerAdvice(basePackages = "com.youyou.address.controller")
public class WorldResponseBodyAdvice implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if (body instanceof String){
return JSON.toJSONString(Result.success(body));
}
return Result.success(body);
}
}
可能要用到的依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
5.controller类
package com.youyou.address.controller;
import com.youyou.address.entity.ContacterDO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* //TODO 添加类/接口功能描述
*
* @author 刘朋
* <br/>date 2019-10-24
*/
@Api(description = "测试返回类型")
@RestController
@RequestMapping(value = "/ResponseBodyAdviceTest")
public class ResponseBodyAdviceController {
@ApiOperation(value = "返回字符串")
@GetMapping("/stringTest")
public String stringTest(){
return "测试!";
}
@ApiOperation(value = "返回对象")
@GetMapping("/objectTest")
public Object objectTest(){
ContacterDO contacterDO = new ContacterDO();
contacterDO.setName("张三");
return contacterDO;
}
}
测试结果如下: