【问题标题】:@BeanParam in Swagger with Resteasy 3.0 and Wildfly 8.0@BeanParam 在 Swagger 中使用 Resteasy 3.0 和 Wildfly 8.0
【发布时间】:2015-02-25 23:45:08
【问题描述】:

我正在尝试使用 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 在带有 Resteasy 的 Swagger 中工作? 我应该添加任何其他依赖项吗?

有了这样的配置,我得到了:

...
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

谢谢

【问题讨论】:

  • 您使用哪个版本的 swagger-core?另外,您是否尝试过从 swagger-jersey2-jaxrs 依赖项中排除 jersey2 依赖项?我想这会消除 WELD 错误。
  • 我用的是最新的swagger(1.3.12)。我更新了上面的 pom.xml 片段。如何排除 jersey2? ?排除>
  • 你需要删除这些:org.glassfish.jersey.media:jersey-media-multipart, org.glassfish.jersey.core:jersey-server, org.glassfish.jersey.core:jersey-客户端,org.glassfish.jersey.core:jersey-common,org.glassfish.jersey.containers:jersey-container-servlet-core。我不能保证它不会破坏任何东西,但这是一个开始。
  • 这并不奇怪。现在是试错的时候了。带回那种依赖,把其余的排除在外。看看你是否会出现 WELD 错误或 CNFE 错误。冲洗,重复。
  • 我删除了该排除项(org.glassfish.jersey.media:jersey-media-multipart)并将其添加为依赖项(LOL),它似乎开始工作了。希望以后不会有太大的破绽。您可以写一些东西作为答案,所以我可以接受它-> 15pts for You。非常感谢:D

标签: java maven resteasy wildfly swagger


【解决方案1】:

尽管 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 风格引入了这些依赖项。基于 cmets 中的交互,解决方案是排除 (&lt;exclusion&gt; ) org.glassfish.jersey.media:jersey-media-multipart 依赖项(这确实是文件上传支持的依赖项)并在主 pom.xml 中再次手动添加它。虽然不是一个优雅的解决方案,但它可以作为一种解决方法。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多