springboot 2
jdk11
统一处理 Controller 层返回的数据,无需每个都手动包装数据
package com.yitong.sny.common.aspect;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yitong.sny.common.annotation.ResponseResource;
import com.yitong.sny.common.utils.Response;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpEntity;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
/**
* 统一处理 RestController 响应结果
*/
@RestControllerAdvice(basePackages = "com.yitong.sny.controller")
@Order(1)
@Slf4j
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
//===============================================
// 响应处理
//===============================================
@Override
public boolean supports(MethodParameter methodParameter, Class aClass) {
// 在 RestController 下的方法返回资源时,加上 @ResponseResource 防止被拦截响应
return !methodParameter.hasMethodAnnotation(ResponseResource.class);
}
@SneakyThrows
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if (body == null) {
return Response.success();
}
if (body instanceof Response || body instanceof HttpEntity || body instanceof Resource) {
return body;
}
// String类型不能直接包装
if (body instanceof String) {
ObjectMapper objectMapper = new ObjectMapper();
// 将数据包装后转换为json串进行返回
return objectMapper.writeValueAsString(Response.success(body));
}
return Response.success(body);
}
}