2013-03-01 124 views
0

我使用JBoss AS 7.1.1,RestEasy的2.3.5.Final,揚鞭1.2.0,3.1.1春季無法線了RestEasy的,春天,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> 

Spring應用程序上下文&的servlet-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

我檢查了代碼。 @Sygagger代碼中的@ Context ServletConfig注入在使用Spring引導時不起作用。它很奇怪。如果沒有Spring,RESTEasy將注入@ Context – jaks 2013-03-04 11:03:26

+0

作爲參考,如果使用RESTEasy FilterDispatcher而不是HttpServletDispatcher,則可以在沒有Spring的情況下獲得相同的堆棧跟蹤。 – 2013-05-10 15:58:52

+0

當它被指定爲函數參數時,所有由於@Context注入而不工作。 – jaks 2013-06-04 10:24:42

回答

2

不僅@Context注射工作。 Swagger依賴於應用程序& ServletConfig,它不是由Spring在方法參數中注入的。

我決定最好編寫代碼來解決這個問題。

  1. 配置被Spring bean讀取。它可以在spring 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,基本路徑,apiPath)

+0

能否請您分享您的解決方案的更多細節? Spring是否仍在使用Resteasy? – 2013-04-02 19:17:19

+0

是的。 Spring正在與RestEasy合作,你需要使用JBoss的RestEasy-Spring依賴。讓我知道你是否需要更多細節。 – jaks 2013-06-04 10:22:43

+0

嗨Jai,您能否添加支持您的觀點的代碼示例? – ritesh 2013-08-01 17:37:46

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,我們已經提到在web.xml everytinh和它在Tomcat 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> 

在spring-context中添加以下內容。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。它應該工作。