1.先自定义返回结果类
public class Result<T> implements Serializable {
private static final long serialVersionUID = -415877140189946393L;
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public static <T> Result<T> SUCCESS(T data){
Result<T> result = new Result<>();
result.setData(data);
return result;
}
}
2.自定义返回处理类
public class ResponseBodyWrapHandler implements HandlerMethodReturnValueHandler {
private HandlerMethodReturnValueHandler handlerMethodReturnValueHandler;
/**
* 用于过滤一些jar包中自带的uri
* */
private String[] filterUrls = {"/index" , "/health"};
private final AntPathMatcher pathMatcher = new AntPathMatcher();
public ResponseBodyWrapHandler(HandlerMethodReturnValueHandler handlerMethodReturnValueHandler) {
this.handlerMethodReturnValueHandler = handlerMethodReturnValueHandler;
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return true;
}
@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
if(webRequest instanceof ServletWebRequest && !(returnValue instanceof Result)){
ServletWebRequest servletWebRequest = (ServletWebRequest) webRequest;
HttpServletRequest request = (HttpServletRequest) servletWebRequest.getNativeRequest();
if(!isFilter(request.getServletPath())){
// 是web数据并且不是result类不进行封装返回
returnValue = Result.SUCCESS(returnValue);
}
}
this.handlerMethodReturnValueHandler.handleReturnValue(returnValue , returnType , mavContainer , webRequest);
}
private Boolean isFilter(String requestUri){
for (String filterUrl : filterUrls) {
if(pathMatcher.match(filterUrl , requestUri)){
return true;
}
}
return false;
}
}
3.替换原有默认的RequestResponseBodyMethodProcessor
@Configuration
public class ResponseBodyWrapFactoryBean implements InitializingBean {
@Autowired
private RequestMappingHandlerAdapter requestMappingHandlerAdapter;
@Override
public void afterPropertiesSet() throws Exception {
// 获取SpringMvc的ReturnValueHandlers
List<HandlerMethodReturnValueHandler> returnValueHandlers = requestMappingHandlerAdapter.getReturnValueHandlers();
if (CollectionUtil.isNotEmpty(returnValueHandlers)) {
// 新建一个List来保存替换后的Handler的List
List<HandlerMethodReturnValueHandler> returnValueHandlerList = CollectionUtil.newArrayList(returnValueHandlers);
// 循环遍历找出RequestResponseBodyMethodProcessor
for (HandlerMethodReturnValueHandler returnValueHandler : returnValueHandlerList) {
if (returnValueHandler instanceof RequestResponseBodyMethodProcessor) {
// 创建定制的Json格式处理Handler
ResponseBodyWrapHandler responseBodyWrapHandler = new ResponseBodyWrapHandler(returnValueHandler);
// 使用定制的Json格式处理Handler替换原有的RequestResponseBodyMethodProcessor
int index = returnValueHandlerList.indexOf(returnValueHandler);
returnValueHandlerList.set(index, responseBodyWrapHandler);
break;
}
}
// 重新设置SpringMVC的ReturnValueHandlers
requestMappingHandlerAdapter.setReturnValueHandlers(returnValueHandlerList);
}
}
}