Vandana
Vandana

Reputation: 81

Swagger-Springfox + WebFlux + JavaX validation (JSR 303) support

I am trying to implement Swagger for documentation, so that it picks both JSR 303 validation annotations and Spring Webflux based classes.

In Spring Boot project, I am currently using:

  1. Spring Webflux framework for some classes
  2. JSR 303 annotations on domain classes for Bean Validations and Constraints
  3. Swagger integration with Spring Fox framework for generating OpenAPI documentation.

In build.gradle, following dependencies are used and I am able to make Spring Webflux + SpringFox work but only JSR 303 is giving issues:

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'

Here is the issue :

When below dependency is added to achieve "Spring Webflux + SpringFox + JSR 303",

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

I am getting the following error,

[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]

Several blogs say that,SpringBoot version 2x doesn't support JSR 303. I am not sure but I tried to see it doesn't work.

Please advise.

Also, If JSR 303 is not supported currently, what other Validation annotations can be used apart from JSR 303 ? I don't want to use Swagger core annotations, only because it is messing up code readability.

Upvotes: 3

Views: 5262

Answers (2)

V. Mokrecov
V. Mokrecov

Reputation: 1094

Add in your pom.xml:

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

And use the annotation:

@EnableSwagger2

In you swagger configuration.

Upvotes: 2

Yauhen Balykin
Yauhen Balykin

Reputation: 771

Officially springfox doesn't support spring webflux(more informations you can read here: springfox issues). But you can try SNAPSHOT version like this: webflux-swagger.

As I can see version greater than 2.3.2, support for bean validation annotations:pringfox-support-for-jsr-303.

Upvotes: 0

Related Questions