0

JBoss AS 7.1.1、RestEasy 2.3.5.Final、Swagger 1.2.0、Spring3.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 application-contextとservlet-context.xmlは問題なく、私のRESTサービスは接続されて機能しています。しかし、Swaggerだけが機能していません。これが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 {
}

チェックしたところ、RestEasy2.3.​​5で@Contextインジェクションが機能していません。とにかく、カスタム構成リーダーを作成しました、

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)
4

3 に答える 3

2

@Contextインジェクションが機能しているだけではありません。Swaggerは、メソッドパラメーターにSpringによって注入されないApplication&ServletConfigに依存しています。

これを修正するコードを書く方が良いと思いました。

  1. 構成はSpringBeanによって読み取られます。これは、springxmlで構成できます。
  2. ドキュメントを公開するためのRESTリソースを作成しました。
  3. RESTクラスは、すべてのクラスをスキャンすることによって検出されます。クラスパスのJavaパッケージからすべてのクラスを読み取るにはどうすればよいですか?のソリューションを使用しました。。
  4. クラスのAPIドキュメントは、Swagger-Jaxrsコードを呼び出すことによって形成されます

    JaxrsApiReader.read(clazz、apiVersion、swaggerVersion、basePath、apiPath)

于 2013-03-07T06:54:48.727 に答える
1

swagger 1.3.0、resteasy、spring 3.x、jboss-as-7を配線できます。

次のように、spring.xmlでSwagger関連のBeanを構成できます。

 <!-- 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="apiteam@wordnik.com"/>
     <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でswaggerを次のように構成できます。

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

詳細については、こちらをご覧ください

于 2014-01-03T14:24:52.657 に答える
0

最近、Springアプリケーションをtomcatからwildfly(JBoos 8)に移行しました。その後、スワガーは機能しませんでした。以前、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>

注: scope = singletonを定義する必要があります。そうしないと、wildflyが例外をスローします。

次に、サーバーを再起動して、URLをロードします。動作するはずです。

于 2014-04-25T18:19:05.413 に答える