OpenApi文档与spring-doc结合ResponseBodyAdvice下正确显示返回类型

Daniel_Wu Daniel_Wu | 300 | 2023-09-27


@Slf4j
@Component
public class CustomGenericResponseService extends GenericResponseService {
    /**
     * Instantiates a new Generic response builder.
     *
     * @param operationService          the operation builder
     * @param returnTypeParsers         the return type parsers
     * @param springDocConfigProperties the spring doc config properties
     * @param propertyResolverUtils     the property resolver utils
     */
    public CustomGenericResponseService(OperationService operationService, List<ReturnTypeParser> returnTypeParsers, SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils) {
        super(operationService, returnTypeParsers, springDocConfigProperties, propertyResolverUtils);
        log.debug("==========CustomGenericResponseService==========");
    }

    /**
     * 扩展原来的方法,修改接口返回类型为真实类型
     *
     * @param components     组件
     * @param annotations    注释
     * @param methodProduces 方法生产
     * @param jsonView       json视图
     * @param returnType     返回类型
     * @return {@link Content}
     */
    @Override
    public Content buildContent(Components components, Annotation[] annotations, String[] methodProduces, JsonView jsonView, Type returnType) {
        ResolvableType resolvableType = ResolvableType.forType(returnType);
        if (!isVoid(returnType) && resolvableType.getRawClass() != ApiResult.class) {
            returnType = ResolvableType.forClassWithGenerics(ApiResult.class, resolvableType).getType();
        }
        return super.buildContent(components, annotations, methodProduces, jsonView, returnType);
    }

    private boolean isVoid(Type returnType) {
        boolean result = false;
        if (!Void.TYPE.equals(returnType) && !Void.class.equals(returnType)) {
            if (returnType instanceof ParameterizedType) {
                Type[] types = ((ParameterizedType)returnType).getActualTypeArguments();
                if (types != null && ConverterUtils.isResponseTypeWrapper(ResolvableType.forType(returnType).getRawClass())) {
                    result = this.isVoid(types[0]);
                }
            }
        } else {
            result = true;
        }

        return result;
    }

}
文章标签: JavaSpringBoot
推荐指数:

真诚点赞 诚不我欺~

OpenApi文档与spring-doc结合ResponseBodyAdvice下正确显示返回类型

点赞 收藏 评论

关于作者

Daniel_Wu
Daniel_Wu

这个人很懒~

等级 LV1

粉丝 0

获赞 0

经验 11