2014-12-29 3 views
1

Я пытаюсь использовать Swagger для документирования моего Rest API. Я хочу использовать аннотацию @BeanParam, однако Swagger интерпретирует модель bean как единое тело . Я изменил свою зависимость от swagger до swagger-jersey2-jaxrs_2.10, но это сделало Wildfly неспособным начать причину ошибки WELD-001408 ошибка (как в первой ссылке ниже). Я прочитал много вещей, но ничего не кажется, чтобы решить мою проблему:@BeanParam в Swagger с Resteasy 3.0 и Wildfly 8.0

Я пытался через изменение зависимостей в моей 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:

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

Какую версию ярости вы используете? Кроме того, вы пробовали исключить зависимости jersey2 от зависимости swagger-jersey2-jaxrs? Я предполагаю, что это приведет к ошибке WELD. – Ron

+0

Я использую новейший swagger (1.3.12). Я обновил фрагмент pom.xml выше.Как я могу исключить jersey2? ? misko321

+0

Yup, с тегом . – Ron

ответ

4

Даже если Resteasy 3.X был официально выпущен примерно полтора года назад, он все еще довольно редко, в по крайней мере, в нашем опыте.

Ядро Swagger поставляется в нескольких вариантах, в качестве модуля воспроизведения, сервлета и JAX-RS. Когда речь заходит о JAX-RS, есть базовая реализация JAX-RS для JAX-RS 1.X, а затем есть конкретные версии для Jersey 1.X и Jersey 2.X.

Реализации Jersey 1.X и 2.X включают поддержку загрузки файлов в эти библиотеки, поскольку, к сожалению, загрузка файлов не является частью спецификации JAX-RS и в конечном итоге является специфичной для реализации.

Однако, другая разница в специфической реализации Джерси 2.X - это поддержка JAX-RS 2.0, которая включает поддержку @BeanParam. На данный момент нет единого модуля JAX-RS 2.0 общего назначения.

От первоначальной ссылки, кажется, что существует конфликт между JBoss/WildFly и загрузкой зависимостей Джерси, которые притягивает вкус Jersey 2.X. Исходя из взаимодействий в комментариях, решение должно исключить (<exclusion>) зависимость org.glassfish.jersey.media:jersey-media-multipart (которая действительно является одной для поддержки загрузки файлов) и добавление ее вручную вручную в основной файл pom.xml. Хотя это не элегантное решение, оно работает как обходное решение.

Я также предложил бы открыть вопрос об этом в репозитории с чартер-ядром. Я полагаю, что внедрение JAX-RS 2.0 со временем будет расти, и мы должны дать ему надлежащую поддержку.