V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chenguoyu
V2EX  ›  Java

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

  •  
  •   chenguoyu · 2018-12-27 19:27:03 +08:00 · 3730 次点击
    这是一个创建于 2161 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    6 条回复    2019-07-23 16:12:37 +08:00
    YzSama
        1
    YzSama  
       2018-12-27 23:13:52 +08:00 via iPad
    注解
    skypyb
        2
    skypyb  
       2018-12-27 23:24:40 +08:00 via Android
    注解确实可以。
    JRay
        3
    JRay  
       2018-12-28 09:57:46 +08:00
    @YzSama 哪一个注解可以实现呢?同样也遇到这个问题
    zhazi
        4
    zhazi  
       2018-12-29 06:08:18 +08:00 via Android
    自己写一个注解 在 supports 里控制
    YzSama
        5
    YzSama  
       2019-01-04 22:01:45 +08:00
    @JRay #3 参考下 4 楼的解答。
    joenali
        6
    joenali  
       2019-07-23 16:12:37 +08:00   ❤️ 1
    注意 @ControllerAdvice 这个注解可以指定 basePackages,只作用业务的 controller,如:
    @ControllerAdvice(basePackages = "com.xxxx.controller")
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3608 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:00 · PVG 13:00 · LAX 21:00 · JFK 00:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.