我正在尝试使用Swagger来记录我的Rest API。我想使用@BeanParam注释,但是Swagger将bean模型解释为单个 body 。我已经将我的招摇依赖性改为 swagger-jersey2-jaxrs_2.10 ,但这使得Wildfly无法启动 WELD-001408 错误(如下面的第一个链接)。我已经阅读了很多东西,但似乎没有解决我的问题:
我已尝试根据链接的线程更改 pom.xml 中的依赖项,现在它看起来像这样:
<dependency>
<groupId>com.wordnik</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.3.12</version>
</dependency>
<dependency>
<groupId>com.wordnik</groupId>
<artifactId>swagger-core_2.10</artifactId>
<version>1.3.12</version>
</dependency>
<dependency>
<groupId>com.wordnik</groupId>
<artifactId>swagger-jersey2-jaxrs_2.10</artifactId>
<version>1.3.12</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers.glassfish</groupId>
<artifactId>jersey-gf-cdi</artifactId>
<version>2.14</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.14</version>
</dependency>
此外,我有一个Swagger的自定义servlet:
public class SwaggerServlet extends HttpServlet {
private static final long serialVersionUID = 4104485315753399385L;
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
BeanConfig beanConfig = new BeanConfig();
beanConfig.setVersion("1.0.2");
beanConfig.setBasePath("/CityAlertsWeb/service");
beanConfig.setResourcePackage("pl.cityalerts.web.controllers");
beanConfig.setScan(true);
ClassReaders.setReader(new JerseyApiReader());
}
}
有没有办法让@BeanParam在Swagger中使用Resteasy? 我应该添加任何其他依赖吗?
有了这样的配置,我得到了:
...
Caused by: java.lang.RuntimeException: Unable to instantiate ContextResolver
at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1607)
at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1310)
at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1232)
at org.jboss.resteasy.spi.ResteasyDeployment.registerProvider(ResteasyDeployment.java:531)
at org.jboss.resteasy.spi.ResteasyDeployment.registration(ResteasyDeployment.java:338)
at org.jboss.resteasy.spi.ResteasyDeployment.start(ResteasyDeployment.java:241)
at org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap.contextInitialized(ResteasyBootstrap.java:28)
at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:173)
at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:187)
... 7 more
Caused by: java.lang.IllegalArgumentException: Unable to find a public constructor for provider class org.glassfish.jersey.media.multipart.MultiPartProperties$Feature$MultiPartContextResolver
at org.jboss.resteasy.spi.ResteasyProviderFactory.createConstructorInjector(ResteasyProviderFactory.java:2184)
at org.jboss.resteasy.spi.ResteasyProviderFactory.createProviderInstance(ResteasyProviderFactory.java:2173)
at org.jboss.resteasy.spi.ResteasyProviderFactory.addContextResolver(ResteasyProviderFactory.java:1072)
at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1601)
... 15 more
由于
答案 0 :(得分:4)
尽管RESTEasy 3.X大约在一年半前正式发布,但至少在我们的经验中它仍然相当罕见。
Swagger-core有多种版本,如Play模块,Servlet和JAX-RS。说到JAX-RS,JAX-RS 1.X有一个基本的JAX-RS实现,然后有针对Jersey 1.X和Jersey 2.X的特定实现。
Jersey 1.X和2.X实现包括支持这些库中的文件上传,遗憾的是,文件上传不是JAX-RS规范的一部分,最终是特定于实现的。
然而,Jersey 2.X特定实现的另一个不同之处是对JAX-RS 2.0的支持,其中包括@BeanParam支持。目前,没有通用的JAX-RS 2.0模块。
从原始链接开始,似乎JBoss / WildFly与加载泽西岛依赖关系之间存在冲突,泽西岛2.X风格引入。基于评论中的交互,解决方案是排除({{1 org.glassfish.jersey.media:jersey-media-multipart依赖项(确实是文件上载支持的依赖项)并在主pom.xml中再次手动添加它。虽然不是一个优雅的解决方案,但它可以作为一种解决方法。
我还建议在swagger-core存储库中打开一个关于它的问题。我想JAX-RS 2.0的采用会随着时间的推移而增长,我们应该给予适当的支持。