ResponseBodyAdvice接口
1 2 3 4 5 6 7 8 9 10
| public interface ResponseBodyAdvice<T> {
boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType);
@Nullable T beforeBodyWrite(@Nullable T body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response); }
|
创建一个处理类实现ResponseBodyAdvice接口
记得添加@RestControllerAdvice注解
@RestControllerAdvice注解是@RestController注解的增强,可以实现三个方面的功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| @RestControllerAdvice public class ResponseAdvice implements ResponseBodyAdvice<Object> {
@Resource private ObjectMapper objectMapper;
@Override public boolean supports(@NonNull MethodParameter returnType, @NonNull Class<? extends HttpMessageConverter<?>> converterType) { return true; } @SneakyThrows @Override public Object beforeBodyWrite(Object body, @NonNull MethodParameter returnType, @NonNull MediaType selectedContentType, @NonNull Class<? extends HttpMessageConverter<?>> selectedConverterType, @NonNull ServerHttpRequest request, @NonNull ServerHttpResponse response) { if (body instanceof String){ return objectMapper.writeValueAsString(ResultData.success(body)); } if (body instanceof ResultData){ return body; } return ResultData.success(body); } }
|
ResultData类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| @Data public class ResultData<T> { private int status; private String message; private T data; private long timestamp;
public ResultData(){ this.timestamp = System.currentTimeMillis(); }
public static <T> ResultData<T> success(T data){ ResultData<T> resultData = new ResultData<>(); resultData.setStatus(ReturnCode.RC100.getCode()); resultData.setMessage(ReturnCode.RC100.getMessage()); resultData.setData(data); return resultData; }
public static <T> ResultData<T> fail(int code, String message){ ResultData<T> resultData = new ResultData<>(); resultData.setStatus(code); resultData.setMessage(message); return resultData; } }
|
ReturnCode类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| @Getter public enum ReturnCode { RC100(100, "操作成功"), RC999(999, "操作失败"), RC200(200, "服务开启限流保护,请稍后再试!"), RC201(201, "服务开启降级保护,请稍后再试!"), RC202(202, "热点参数限流,请稍后再试!"), RC203(203, "系统规则不满足要求,请稍后再试!"), RC204(204, "系统规则不通过,请稍后再试!"), RC403(403, "无访问权限,请联系管理员授予权限"), RC401(401, "匿名用户访问无权限资源异常"), RC500(500, "系统错误,请稍后重试"),
INVALID_TOKEN(2001, "访问令牌不合法"), ACCESS_DENIED(2003, "没有权限访问该资源"), CLIENT_AUTHENTICATION_FAILED(1001, "客户端认证失败"), USERNAME_OR_PASSWORD_ERROR(1002, "用户名或密码错误"), UNSUPPORTED_GRANT_TYPE(1003, "不支持的认证模式");
private final int code; private final String message; ReturnCode(int code, String message){ this.code = code; this.message = message; } }
|
测试
1 2 3 4 5 6 7 8 9 10 11 12 13
| @RestController @RequestMapping("/product/attr") public class ProductController {
@Resource private ProductAttrService productAttrService;
@GetMapping("/info/{attrId}") public ProductAttr getAttrIdById(@PathVariable("attrId") Long attrId){ return productAttrService.getById(attrId); }
}
|
返回信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| { "status": 100, "message": "操作成功", "data": { "attrId": 14, "attrName": "机身材质工艺", "searchType": 0, "valueType": 1, "icon": "xxx", "valueSelect": "以官网信息为准;陶瓷;玻璃", "attrType": 1, "enable": 1, "catelogId": 225, "showDesc": 0 }, "timestamp": 1711606818713 }
|