Swagger UI with Java9 (spring boot 2.0)
Swagger UI with Java9 (spring boot 2.0)
我正在尝试让 swagger UI 与我的服务一起工作。我使用的是 spring boot 2.0 和 Java 9. swagger
添加了如下依赖
compile('io.springfox:springfox-swagger2:2.8.0')
compile('io.springfox:springfox-swagger-ui:2.8.0')
Swagger 已按应有的方式配置
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}
}
编译良好,但当我使用 BootRun 命令启动应用程序时,它失败了,原因是:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xmlModelPlugin': Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [springfox.documentation.schema.XmlModelPlugin] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@4f8e5cde]
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlType
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
... 25 common frames omitted
可能是什么问题?与 Java9 不兼容?那我能不能让它工作呢?
是的,这与 java9 不兼容。
我认为你有三个选择:
- 添加对 xml api 的显式依赖,例如
compile('javax.xml.bind:jaxb-api:2.3.0')
- 将 springfox 版本更新为 2.9.0
- 将
--add-modules java.xml.bind
添加到 jvm 启动参数(与其他选项相比,这只是一种解决方法而不是修复,因为 this module will be removed in the later versions of java)
进一步阅读 Spring 引导和 java 9:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-with-Java-9-and-above
在 Maven Central 中找不到版本 2.9.0。可用版本为 2.9.1
和 2.9.2
https://mvnrepository.com/artifact/io.springfox/springfox-swagger2
根据@eis 的建议,从 2.8.0
升级到 2.9.2
后,我解决了这个问题
我不确定这个非常具体的错误,但总的来说 Swagger 2.9.x 似乎与 SpringBoot 2.0.x
不兼容
一些已记录的问题:
https://github.com/springfox/springfox/issues/1773(主要)
https://github.com/springfox/springfox/issues/2501
有一个 3.0.0-SNAPSHOT 版本,这个 Spring 引导版本可能更稳定。
我正在尝试让 swagger UI 与我的服务一起工作。我使用的是 spring boot 2.0 和 Java 9. swagger
添加了如下依赖compile('io.springfox:springfox-swagger2:2.8.0')
compile('io.springfox:springfox-swagger-ui:2.8.0')
Swagger 已按应有的方式配置
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}
}
编译良好,但当我使用 BootRun 命令启动应用程序时,它失败了,原因是:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xmlModelPlugin': Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [springfox.documentation.schema.XmlModelPlugin] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@4f8e5cde]
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlType
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
... 25 common frames omitted
可能是什么问题?与 Java9 不兼容?那我能不能让它工作呢?
是的,这与 java9 不兼容。
我认为你有三个选择:
- 添加对 xml api 的显式依赖,例如
compile('javax.xml.bind:jaxb-api:2.3.0')
- 将 springfox 版本更新为 2.9.0
- 将
--add-modules java.xml.bind
添加到 jvm 启动参数(与其他选项相比,这只是一种解决方法而不是修复,因为 this module will be removed in the later versions of java)
进一步阅读 Spring 引导和 java 9:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-with-Java-9-and-above
在 Maven Central 中找不到版本 2.9.0。可用版本为 2.9.1
和 2.9.2
https://mvnrepository.com/artifact/io.springfox/springfox-swagger2
根据@eis 的建议,从 2.8.0
升级到 2.9.2
后,我解决了这个问题
我不确定这个非常具体的错误,但总的来说 Swagger 2.9.x 似乎与 SpringBoot 2.0.x
不兼容一些已记录的问题: https://github.com/springfox/springfox/issues/1773(主要) https://github.com/springfox/springfox/issues/2501
有一个 3.0.0-SNAPSHOT 版本,这个 Spring 引导版本可能更稳定。