SpringDoc2问题汇总

在项目中尝试使用SpringDoc进行文档生成,在使用过程中遇到一系列的问题加以记录.

1.引入依赖

只是单纯的使用SpringDoc的话不需要引入一些乱七八糟的依赖,如今各种增强和拓展依赖层出不穷,但是随着这些依赖的出现带来的不仅是增强,还有各种效率问题。我认为这个还是需要根据个人和项目的需求去进行引入.

        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
            <version>2.6.0</version>
        </dependency>

 这个依赖包里包含了SpringDoc和Swagger,可以开箱即用之前用springdoc-openapi-ui,用起来感觉非常难受。

2.Security结合SpringDoc问题

需要SpringSecurity放行部分路径,这里只提供我的参考路径,另外Security方行的问题我会另起一篇来讲.

如果还需要在Swagger中进行调试,需要对OpeanAPI进行一些配置

    @Bean
    public OpenAPI costomOpenAPI() {
        OpenAPI openApi = new OpenAPI().addSecurityItem(new SecurityRequirement().addList("bearerAuth")).components(
                new Components()
                        .addSecuritySchemes(
               //这个是自定义的验证名称,用于在对应方法上注解表示使用Security授权调试
                                "bearerAuth", 
                                new SecurityScheme()
                    
                                        //验证请求方式
                                        .type(SecurityScheme.Type.HTTP)
                                        
                                        //验证数据格式
                                        .bearerFormat("JWT")
                                        .in(SecurityScheme.In.HEADER)
                                        
                                        //请求头key
                                        .name("Access-Token")
                                        
                                        //权限验证方式
                                        .scheme("bearer")
                        )
        ).info(costomInfo());

        return openApi;
    }

 在代码中的使用:

    @PostMapping("/register")
    @RequestLimit(coolTime = 60, maxCount = 5)
    @Operation(summary = "用户注册(1)", security = @SecurityRequirement(name = "bearerAuth"), description = "用户注册邮箱和密码", requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = @Content(mediaType = "application/json")))
    public ResultVO<Boolean> userRegister(
            @RequestBody @Valid UserFirstRegisterVO userFirstRegisterVO) {
        return userService.userRegister(userFirstRegisterVO);
    }

3.@RestControllerAdvice拦截SpringDoc返回数据

当使用响应结果处理器时,SpringDoc数据也会被拦截,最好就是将其数据排除在外,也避免对其他包装逻辑的入侵.

@RestControllerAdvice(basePackageClasses = {SpringDocConfig.class})
@RestControllerAdvice(basePackages = {"org.springdoc.**"})

4.使用自定义顺序的MessageConverter时,返回数据为Base64字符串.

当我调用 /v3/api-docs接口时,Swagger显示如下:

这段话一开始令我费解,因为依赖包中的版本都是对应的,通过各种问题查询我意识到这应该是Swagger未接收到返回数据,无法展示API界面,后来看到一篇解决文章,然后自己去调试解决了问题,问题文章在此,有兴趣的可以看下 问题文章

这个问题挺有意思的,我来进行更详细的分析和解决方案.

原因就是调换了MVC原始的报文解析顺序,导致SpringDoc返回的byte[]被Jackson2报文解析器将其解析成了Base64,然后swagger无法解析。 

其实知道了问题后,解决的办法有很多很多,我去Git看了原作者给出的解决方案,已经过时了.

1.重写OpenApiResource

其要求继承OpenApiResource,然后将其解析成json格式返回,但是现在返回需为byte[],并且我尝试重写后并没有配置到SpringDoc中,而作者说会自动生效,后续再看看什么情况,或许可以考虑切面对返回值进行转换.

2.添加或调换MessageConverter顺序

出现此问题最根本的原因就是因为调换了MVC中最原始的报文解析顺序,原来应该排在最前的ByteArrayHttpMessageConverter被我放到Jekson2后面去了,但是我不希望因为SpringDoc一个问题而去修改我原来对其他请求的解析顺序,所以重新创建了一个继承ByteArray报文解析器,只需对support进行定义就好,这样就只会对/v3/api-docs返回的byte[]数据进行解析.

public class SpringDocHttpMessageConverter extends ByteArrayHttpMessageConverter {

    /**
     * 只转换SpringDoc返回的byte[]数据
     * @param clazz 其clazz是一个java.util.Collections$SynchronizedSortedMap,无法进行类型比较
     * @return true /false
     */
    @Override
    public boolean supports(Class<?> clazz) {
        return byte[].class == clazz && clazz.getName().equals("[B");
    }
}

这里Class对象只能去跟byte数组类型进行比较,因为/swagger-config接口去调用时也是通过SpringDoc返回的,但是却返回的是json数据,所以只能通过name去判断是否是/v3/api-docs获取的API数据.

然后将其放在Jekson2前面

        //将json转换器排到最前面
        converters.add(0, first);
        converters.add(0, new SpringDocHttpMessageConverter());

 后续有更好或者更优雅的办法再考虑考虑。

1 Spring基本特征 6 2 Spring的组成 6 2.1 Spring的jar包 6 2.2 Spring配置文件 7 2.3 Spring API 8 3 Spring基本功能详解 8 3.1 SpringIOC 8 3.2别名Alias 11 别名拓展: 11 3.3 Spring容器内部对象的创建 12 Spring容器内部对象创建拓展: 12 3.3.1使用类构造器实例化(默认无参数) 14 3.3.2使用静态工厂方法实例化(简单工厂模式) 14 3.3.3初始化(创建)bean时机 15 Lazy-init初始化bean的时机拓展: 15 3.4 Bean的作用域 16 Scope单例多例作用域拓展: 16 3.4.1 singleton(默认值) 16 3.4.2 prototype 17 3.4.3 Request 17 3.4.4 Session 18 3.4.5 Global session 18 3.4.6 指定Bean的初始化方法和销毁方法 18 Bean的初始化和销毁拓展: 18 Spring的IOC总结: 20 3.5 依赖注入(DI) 20 3.5.1 使用构造器注入 20 3.5.2 使用属性setting方法进行注入 21 3.5.3 装配list集合 22 3.5.4 装配set集合 22 3.5.5 装配map 22 3.5.6 装配Properties 23 3.6 注解注入 23 注解注入拓展: 23 3.6.1 @Autowired 26 3.6.2 @Qualifier 27 3.6.3 @Resource 27 3.6.4 @PostConstruct 28 3.6.5 @PreDestroy 28 注解注入拓展: 28 3.7扫描注入 30 注解扫描拓展: 32 Mvc用注解写: 34 Spring容器IOC和di的整个启动过程: 38 3.8 spring中的继承 38 拓展spring为类中的属性赋值: 40 小结: 47 面向接口编程: 47 4 面向切面编程 52 4.1 代理模式 52 代理模式拓展: 52 4.1.1 JDK动态代理 58 JDK动态代理拓展: 59 4.1.2 CGLIB做代理 66 CGLIB动态代理拓展: 68 4.1.3 Spring的动态代理 71 4.2 AOP编程 71 4.2.1概念: 71 SpringAOP概念拓展: 73 之前实现了目标方法的动态调用,现在来实现切面的动态调用。 74 4.2.2 AOP实现的两种模式 78 4.2.2.1 xml形式 78 XML形式拓展: 81 异常通知处理例子: 91 不用spring异常通知,另一种处理异常 96 4.2.2.2Aop注解形式(了解) 99 注解注入拓展: 103 5 Spring数据库 106 5.1 Spring+JDBC 106 5.1.1 Jdbc编程特点 106 5.1.2引入DataSource 106 5.1.3 核心类JdbcTemplate 106 5.1.4 使用JdbcTemplate 106 5.1.5 继承JdbcDaoSupport 107 5.1.6 使用properties文件 107 5.1.7 RowMapper的使用 107 拓展: 108 DataSource注入的三种方式: 108 5.1.8声明式事务管理 116 5.1.8.1Spring的事务管理器 117 5.1.8.2Spring事务的传播属性 117 5.1.8.3Spring事务的隔离级别 117 拓展: 118 5.1.8.4以XML配置的 形式 119 拓展: 120 5.1.8.5以注解方式配置 125 拓展: 127 5.1.9使用CGLIB以XML形式配置事务 130 5.2 Spring+Hibernate 131 5.2.1 HibernateTemplate模板 131 5.2.2 声明式事务 131 配置XML文件 131 拓展: 132 注解形式: 137 拓展: 138 6 Struts2+spring+hibernate 141 6.1 需要添加的jar包 141 6.2 Spring融合web服务器 141 6.3 struts.xml文件 143 6.4 OpenInSessionView 143 拓展: 144 实例: 146
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值