Gateway整合springdoc添加统一结果处理后报错解决方法

254 阅读1分钟

前提条件

准备工程

工程结构.png

account和consumer为两个应用服务,具体集成springdoc的方法可参考博文。(感觉写的还不错)

上图示例工程源码 代码仅供参考

问题描述

在应用服务中统一处理返回结果时,具体代码实现

@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {

    @Resource
    private ObjectMapper objectMapper;

    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType,
                                  Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest,
                                  ServerHttpResponse serverHttpResponse) {
        if (o instanceof String) {
            return objectMapper.writeValueAsString(RestResponse.success(o));
        }
        if (o instanceof RestResponse) {
            return o;
        }
        return RestResponse.success(o);
    }
}

报错截图

报错截图.png

解决方法

@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {

    @Resource
    private ObjectMapper objectMapper;

    /**
     * 判断是否要执行 beforeBodyWrite 方法,true为执行,false不执行,有注解标记的时候处理返回值
     * 这里整合swagger出现了问题,swagger相关的不拦截
     */
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return !methodParameter.getDeclaringClass().getName().contains("OpenApi");
    }

    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType,
                                  Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest,
                                  ServerHttpResponse serverHttpResponse) {
        if (o instanceof String) {
            return objectMapper.writeValueAsString(RestResponse.success(o));
        }
        if (o instanceof RestResponse) {
            return o;
        }
        return RestResponse.success(o);
    }
}