Swagger-Springfox + WebFlux + JavaX验证(JSR 303)支持

时间:2018-11-01 15:27:14

标签: swagger spring-webflux reactive springfox jsr

我正在尝试为文档实现Swagger,以便它同时选择JSR 303验证注释和基于Spring Webflux的类。

在Spring Boot项目中,我当前正在使用:

  1. 某些类的Spring Webflux框架
  2. 用于Bean验证和约束的域类上的JSR 303批注
  3. Swagger与Spring Fox框架集成以生成OpenAPI文档。

在build.gradle中,使用了以下依赖关系,并且我能够使Spring Webflux + SpringFox正常工作,但是只有JSR 303出现了问题:

springBootVersion = '2.0.2.RELEASE'

//JavaX-validation    
'javax.validation:validation-api:2.0.0.Final',    
'javax.el:javax.el-api:3.0.0',    
'org.glassfish.web:javax.el:2.2.6'

//SpringFox-Swagger    
'io.springfox:springfox-swagger2:2.9.2',    
'io.springfox:springfox-spring-webflux:3.0.0-SNAPSHOT',    
'io.github.swagger2markup:swagger2markup-gradle-plugin:1.3.3'

问题出在这里:

添加以下依赖项以实现“ Spring Webflux + SpringFox + JSR 303”

**'io.springfox:springfox-bean-validators:2.9.2'**

我遇到以下错误,

[WARN ] 2018-11-01 10:16:50.535 [main] SpringApplication - Unable to close ApplicationContext    
java.lang.IllegalStateException: Failed to introspect Class 
             springfox.documentation.swagger2.configuration.Swagger2DocumentationConfiguration] from ClassLoader [sun.misc.Launcher$AppClassLoader@764c12b6]  

    at 
     org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:659) ~[spring-core-5.0.6.RELEASE.jar:5.0.6.RELEASE]    
         at 
     org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:556 ) ~[spring-core-5.0.6.RELEASE.jar:5.0.6.RELEASE]     
        at 
     org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.ge tTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:724) ~[spring- beans-5.0.6.RELEASE.jar:5.0.6.RELEASE]    
         at 
     org.springframework.boot.SpringApplication.handleExitCode(SpringApplication.java:861) ~[spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE]    
        at 
     org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:810) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE]    
        at 
     org.springframework.boot.SpringApplication.run(SpringApplication.java:1255) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE]     
     Caused by: java.lang.NoClassDefFoundError: 
     org/springframework/web/servlet/HandlerMapping
        at java.lang.Class.getDeclaredMethods0(Native Method) ~[?:1.8.0_92]
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source) ~[?:1.8.0_92]
        at java.lang.Class.getDeclaredMethods(Unknown Source) ~[?:1.8.0_92]
        at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:641) ~[spring-core-5.0.6.RELEASE.jar:5.0.6.RELEASE]
        ... 20 more            
    Caused by: java.lang.ClassNotFoundException: org.springframework.web.servlet.HandlerMapping
        at java.net.URLClassLoader.findClass(Unknown Source) ~[?:1.8.0_92]
        at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_92]

几个博客都说,SpringBoot 2x版本不支持JSR303。我不确定,但是我试图看到它不起作用。

请告知。

此外,如果当前不支持JSR 303,除了JSR 303之外,还可以使用其他哪些Validation注释? 我不想使用Swagger核心注释,只是因为它搞乱了代码的可读性。

2 个答案:

答案 0 :(得分:0)

springfox 官方不支持 spring webflux (更多信息,您可以在此处阅读:springfox issues)。 但是您可以尝试这样的SNAPSHOT版本:webflux-swagger

如我所见,版本高于2.3.2,支持bean验证批注:pringfox-support-for-jsr-303

答案 1 :(得分:0)

添加您的pom.xml:

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>3.0.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>3.0.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-spring-webflux</artifactId>
        <version>3.0.0-SNAPSHOT</version>
    </dependency>

并使用注释:

@EnableSwagger2WebFlux

在敏捷配置中。