2013-03-01 38 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。它应该工作。