2013-03-01 2 views
0

Я использую JBoss AS 7.1.1, Resteasy 2.3.5.Final, Swagger 1.2.0, Spring 3.1.1Невозможно провод вверх чванство с Resteasy, Spring, JBoss AS 7.1.1

Здесь мой web.xml,

<?xml version="1.0" encoding="UTF-8"?> 
<web-app> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:/META-INF/spring/application-context.xml</param-value> 
    </context-param> 

    <servlet> 
     <servlet-name>Bootstrap</servlet-name> 
     <servlet-class>com.js.api.Bootstrap</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet> 
     <servlet-name>springServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/spring/servlet-context.xml</param-value> 
     </init-param> 
     <init-param> 
      <param-name>swagger.config.reader</param-name> 
      <param-value>com.js.api.RestEasyConfigReader</param-value> 
     </init-param> 
     <init-param> 
      <param-name>swagger.api.basepath</param-name> 
      <param-value>http://localhost:8080/js</param-value> 
     </init-param> 
     <init-param> 
      <param-name>api.version</param-name> 
      <param-value>1.0</param-value> 
     </init-param> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>springServlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
</web-app> 

весна приложение контекст & сервлет-context.xml прекрасен и мой REST услуга проводные и работают. Но только чванство не работает. Вот ApiListingResource,

package com.js.resource; 

import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 

import org.springframework.stereotype.Controller; 

import com.wordnik.swagger.annotations.Api; 
import com.wordnik.swagger.jaxrs.listing.ApiListing; 

@Path("/api-docs") 
@Api("/api-docs") 
@Produces({ "application/json" }) 
@Controller 
public class ApiListingResource extends ApiListing { 
} 

Я проверил и @Context инъекции не работает в Resteasy 2.3.5. Во всяком случае создается для чтения пользовательских конфигурации,

import javax.servlet.ServletConfig; 
import com.wordnik.swagger.jaxrs.ConfigReader; 

public class RestEasyConfigReader extends ConfigReader { 

    private ServletConfig config; 

    public RestEasyConfigReader(ServletConfig config){ 
    this.config = config; 
    } 

    @Override 
    public String basePath() { 
    return getParameterOrDefault("swagger.api.basepath", "http://localhost:8080/js"); 
    } 

    @Override 
    public String swaggerVersion() { 
    return "1.2"; 
    } 

    @Override 
    public String apiVersion() { 
    return "1.0"; 
    } 

    @Override 
    public String modelPackages() { 
    return "com.js.model"; 
    } 

    @Override 
    public String apiFilterClassName() { 
    return null; 
    } 

    private String getParameterOrDefault(String key, String defaultValue){ 
    if ((config != null) && (config.getInitParameter(key) !=null)) 
     return config.getInitParameter(key); 

    return defaultValue; 
    } 
} 

Я всегда получаю ошибку NPE, когда я пытаюсь получить доступ http://localhost:8080/js/api-docs

java.lang.NullPointerException 
    com.wordnik.swagger.jaxrs.ConfigReaderFactory$.getConfigReader(Help.scala:88) 
    com.wordnik.swagger.jaxrs.listing.ApiListing.resourceListing(ApiListing.scala:64) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:601) 
    org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:155) 
    org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:257) 
    org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:222) 
    org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:211) 
    org.jboss.resteasy.springmvc.ResteasyHandlerAdapter.createModelAndView(ResteasyHandlerAdapter.java:87) 
    org.jboss.resteasy.springmvc.ResteasyHandlerAdapter.handle(ResteasyHandlerAdapter.java:74) 
    org.jboss.resteasy.springmvc.ResteasyHandlerAdapter.handle(ResteasyHandlerAdapter.java:24) 
    org.jboss.resteasy.springmvc.ResteasyWebHandlerTemplate.handle(ResteasyWebHandlerTemplate.java:39) 
    org.jboss.resteasy.springmvc.ResteasyHandlerAdapter.handle(ResteasyHandlerAdapter.java:45) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:734) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
+0

Я проверил код. @ Context ServletConfig инъекция в коде Swagger не работает при загрузке с помощью Spring. Это странно. Без весны RESTEasy вводит @ Context – jaks

+0

Для справки вы можете получить ту же стек стек без Spring, если вы используете RESTEasy FilterDispatcher, а не HttpServletDispatcher. –

+0

Его все из-за инъекции @Context не работает, когда он указан как параметр функции. – jaks

ответ

2

Не только инъекции @Context работает. Swagger полагается на Application & ServletConfig, который не вводится Spring в параметры метода.

Я решил, что лучше написать код, чтобы исправить это.

  1. Конфигурация читается фасолью весны. Его можно настроить весной xml.
  2. Написал ресурс REST, чтобы разоблачить документацию.
  3. Классы REST находятся при сканировании всех классов. Использовал решение от How do I read all classes from a Java package in the classpath?.
  4. API документ для класса формируется путем вызова Форс-Jaxrs код

    JaxrsApiReader.read (clazz, apiVersion, swaggerVersion, BasePath, apiPath)

+0

Не могли бы вы поделиться более подробной информацией о своем решении? Весна все еще работает с Resteasy? –

+0

Да. Spring работает с RestEasy, вам нужно использовать зависимость от RestEasy-Spring от JBoss. Дайте мне знать, если вам нужно больше деталей. – jaks

+0

Привет, Джай, Не могли бы вы добавить образец кода, поддерживающий ваши баллы? – ritesh

1

Я могу телеграфировать чванство 1.3 .0, resteasy, spring 3.x и jboss-as-7.

Вы можете настроить чванство, связанные бобы в spring.xml следующим образом:

<!-- Swagger providers --> 
    <bean id="apiDeclarationProvider" class="com.wordnik.swagger.jaxrs.listing.ApiDeclarationProvider" /> 
    <bean id="resourceListingProvider" class="com.wordnik.swagger.jaxrs.listing.ResourceListingProvider" /> 

<!-- Swagger API listing resource --> 
    <bean id="swaggerResourceJSON" class="com.wordnik.swagger.jaxrs.listing.ApiListingResourceJSON" /> 

<!-- this scans the classes for resources --> 
    <bean id="swaggerConfig" class="com.wordnik.swagger.jaxrs.config.BeanConfig"> 
    <property name="resourcePackage" value="package.name"/> 
    <property name="version" value="1.0.0"/> 
    <property name="basePath" value="http://localhost:8081/resteasy-spring"/> 
    <property name="title" value="Petstore sample app"/> 
    <property name="description" value="This is a app."/> 
    <property name="contact" value="[email protected]"/> 
    <property name="license" value="Apache 2.0 License"/> 
    <property name="licenseUrl" value="http://www.apache.org/licenses/LICENSE-2.0.html"/> 
    <property name="scan" value="true"/> 
    </bean> 

Затем Вы можете настроить развязность в web.xml как:

<servlet> 
    <servlet-name>DefaultJaxrsConfig</servlet-name> 
    <servlet-class>com.wordnik.swagger.jaxrs.config.DefaultJaxrsConfig</servlet-class> 
    <init-param> 
     <param-name>api.version</param-name> 
     <param-value>1.0.0</param-value> 
    </init-param> 
    <load-on-startup>2</load-on-startup> 
</servlet> 

Для более подробной информации: посетите here.

0

В последнее время мы применили наше приложение Spring от tomcat к wildfly (JBoos 8). После этого чванство не сработало. Previuosly, мы уже упоминали everytinh в web.xml и она работает отлично на коте 7. После изменения в wildfly, мы сделали следующие изменения:

Мы удалили следующие из web.xml:

<servlet> 
     <servlet-name>DefaultJaxrsConfig</servlet-name> 
     <servlet-class>com.wordnik.swagger.jaxrs.config.DefaultJaxrsConfig</servlet-class> 
     <init-param> 
      <param-name>api.version</param-name> 
      <param-value>1.0.0</param-value> 
     </init-param> 
     <init-param> 
      <param-name>swagger.api.basepath</param-name> 
      <param-value>http://localhost:8080/rest/api</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
</servlet> 

Добавьте следующее в весенний контекст.XML:

<!-- Swagger providers --> 
    <bean id="apiDeclarationProvider" 
     class="com.wordnik.swagger.jaxrs.listing.ApiDeclarationProvider" scope="singleton" /> 
    <bean id="resourceListingProvider" 
     class="com.wordnik.swagger.jaxrs.listing.ResourceListingProvider" scope="singleton"/> 

    <!-- Swagger API listing resource --> 
    <bean id="swaggerResourceJSON" 
     class="com.wordnik.swagger.jaxrs.listing.ApiListingResourceJSON" /> 

<!-- this scans the classes for resources --> 
    <bean id="swaggerConfig" class="com.wordnik.swagger.jaxrs.config.BeanConfig"> 
     <property name="resourcePackage" value="com.rest" /> 
     <property name="version" value="1.0.0" /> 
     <property name="basePath" value="https://localhost:9880/rest/api" /> 
     <property name="title" value="REST API" /> 
     <property name="scan" value="true" /> 
    </bean> 

ПРИМЕЧАНИЕ: Вам необходимо определить области действия = синглтон иначе wildfly будет сгенерировано исключение.

Теперь перезагрузите сервер и загрузите URL-адрес. Он должен работать.