在 spring 中提供了个 ResponseBodyAdvice 接口,可以帮助我们将返回的值进行统一封装,代码如下
@ControllerAdvice
@Slf4j
public class MyResponseBodyAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
log.debug("MyResponseBodyAdvice==>supports:" + converterType);
log.debug("MyResponseBodyAdvice==>supports:" + returnType.getClass());
log.debug("MyResponseBodyAdvice==>supports:" + MappingJackson2HttpMessageConverter.class.isAssignableFrom(converterType));
return MappingJackson2HttpMessageConverter.class.isAssignableFrom(converterType);
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType,
MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response) {
if (body == null) {
return Result.success();
}
if (body instanceof Result || body instanceof File || body instanceof ResponseEntity) {
return body;
} else {
log.debug("MyResponseBodyAdvice==>beforeBodyWrite:" + returnType + "," + body);
return Result.success(body);
}
}
}
但是现在有个问题就是,一些第三方组件也使用 json 通信,比如 swagger。这时候就需要排除这些东西,或者是指定切面才进行统一封装。
请问 V 友们应该怎么做,可以不用 ResponseBodyAdvice 接口
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.