java - @BeanParam 在 Swagger 中使用 Resteasy 3.0 和 Wildfly 8.0

标签 java maven resteasy wildfly swagger

我正在尝试使用 Swagger 来记录我的 Rest API。我想使用 @BeanParam 注释,但是 Swagger 将 bean 模型解释为单个 body。我已将我的 swagger 依赖项更改为 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

谢谢

最佳答案

尽管 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 与加载 Jersey 依赖项之间似乎存在冲突,而 Jersey 2.X 风格引入了这一冲突。根据评论中的交互,解决方案是排除(<exclusion> ) org.glassfish.jersey.media:jersey-media-multipart 依赖项(这确实是文件上传支持的依赖项)并在主 pom.xml 中再次手动添加它。虽然不是一个优雅的解决方案,但它可以作为一种解决方法。

我还建议在 swagger-core 存储库中打开一个关于它的问题。我想 JAX-RS 2.0 的采用会随着时间的推移而增长,我们应该给予它适当的支持。

关于java - @BeanParam 在 Swagger 中使用 Resteasy 3.0 和 Wildfly 8.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27694804/

相关文章:

java - 旋转GeomeryUpdater不是抽象的并且不会重写抽象方法updateData(Geometry)?

java - 从巨大的集合中遍历和分组相似对象的有效方法

java - 流口水返回最低显着性规则

java - 如何在 Spring Boot 应用程序中实现安全性?

java - Maven 依赖项在 WEB-INF/lib 中不可见

java - JBoss RESTEasy 无法扫描 WEB-INF 中的 JAX-RS 注释

java - 打印出一个字符串数组,但每次替换一个元素。 java

eclipse - 在 Eclipse + jboss 5.1.0 中获取 "java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet"

java - JAX-RS如何处理错误的内容类型

eclipse - 非多项目环境的 Gradle 依赖项