spring 中统一封装返回参数的问题

2018-12-27 19:27:03 +08:00
 chenguoyu

在 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 接口

3747 次点击
所在节点    Java
6 条回复
YzSama
2018-12-27 23:13:52 +08:00
注解
skypyb
2018-12-27 23:24:40 +08:00
注解确实可以。
JRay
2018-12-28 09:57:46 +08:00
@YzSama 哪一个注解可以实现呢?同样也遇到这个问题
zhazi
2018-12-29 06:08:18 +08:00
自己写一个注解 在 supports 里控制
YzSama
2019-01-04 22:01:45 +08:00
@JRay #3 参考下 4 楼的解答。
joenali
2019-07-23 16:12:37 +08:00
注意 @ControllerAdvice 这个注解可以指定 basePackages,只作用业务的 controller,如:
@ControllerAdvice(basePackages = "com.xxxx.controller")

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/521648

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX