V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
chenguoyu
V2EX  ›  Java

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

  •  
  •   chenguoyu · Dec 27, 2018 · 4447 views
    This topic created in 2683 days ago, the information mentioned may be changed or developed.

    在 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 replies    2019-07-23 16:12:37 +08:00
    YzSama
        1
    YzSama  
       Dec 27, 2018 via iPad
    注解
    skypyb
        2
    skypyb  
       Dec 27, 2018 via Android
    注解确实可以。
    JRay
        3
    JRay  
       Dec 28, 2018
    @YzSama 哪一个注解可以实现呢?同样也遇到这个问题
    zhazi
        4
    zhazi  
       Dec 29, 2018 via Android
    自己写一个注解 在 supports 里控制
    YzSama
        5
    YzSama  
       Jan 4, 2019
    @JRay #3 参考下 4 楼的解答。
    joenali
        6
    joenali  
       Jul 23, 2019   ❤️ 1
    注意 @ControllerAdvice 这个注解可以指定 basePackages,只作用业务的 controller,如:
    @ControllerAdvice(basePackages = "com.xxxx.controller")
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2529 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 02:59 · PVG 10:59 · LAX 19:59 · JFK 22:59
    ♥ Do have faith in what you're doing.