2015-12-03 36 views
3

我實現了一個項目,該項目使用非常簡單的JAX-RS後端爲基於AngularJS的用戶界面提供數據。這些是分離的模塊並部署在Wildfly 9上。爲了讓REST端點有一個很好的文檔,我遇到了swagger.io,這看起來很合適。但是,由於我的項目結構略有不同,因此我無法在文檔和示例之後設置swagger。問題在JBoss/Wildfly上使用JAX-RS項目設置Swagger.io 9

現狀

我可以訪問http://localhost:8080/service/swagger.json返回

{ 
    "swagger": "2.0", 
    "info": { 
     "version": "1.0.0", 
     "title": "" 
    }, 
    "host": "localhost:8080", 
    "basePath": "/service", 
    "schemes": ["http"] 
} 

但是招搖的UI(swagger.json正確連接)不顯示我的任何REST端點。

我認爲這個問題可能與爲Wildfly設置的basePath或contextRoot有關,但這只是一個模糊的猜測。除此之外,我甚至不確定使用什麼樣的Swagger JAX-RS實現。我認爲自從我使用Wildfly(JBoss)以來,它應該是Resteasy,但是Swagger Jersey設置文檔看起來更合適。

我的REST端點看起來像像http://localhost:8080/service/users/register

相關資源

的pom.xml

<dependency> 
    <groupId>io.swagger</groupId> 
    <artifactId>swagger-core</artifactId> 
    <version>1.5.4</version> 
</dependency> 
<dependency> 
    <groupId>io.swagger</groupId> 
    <artifactId>swagger-jaxrs</artifactId> 
    <version>1.5.4</version> 
</dependency> 
<dependency> 
    <groupId>io.swagger</groupId> 
    <artifactId>swagger-annotations</artifactId> 
    <version>1.5.4</version> 
</dependency> 

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
     version="3.1"> 
    <display-name>service</display-name> 

    <servlet> 
     <servlet-name>javax.ws.rs.core.Application</servlet-name> 
     <init-param> 
      <param-name>jersey.config.server.provider.packages</param-name> 
      <param-value> 
       io.swagger.jaxrs.listing, 
       jfs.service.services 
      </param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>javax.ws.rs.core.Application</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

    <servlet> 
     <servlet-name>Jersey2Config</servlet-name> 
     <servlet-class>io.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/service</param-value> 
     </init-param> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 
</web-app> 

的jboss-web.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-web> 
    <context-root>/service/</context-root> 
</jboss-web> 

UserWebService爲例

package jfs.service.services; 

import com.google.gson.Gson; 
import io.swagger.annotations.*; 
import jfs.data.dataobjects.UserDO; 
import jfs.data.dataobjects.enums.UserType; 
import jfs.service.sessions.Session; 
import jfs.transferdata.transferobjects.*; 

import javax.inject.Inject; 
import javax.ws.rs.Consumes; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import java.util.List; 

@Path("/users") 
@Api(tags = {"users"}, value = "/users", description = "Operations about user") 
public class UserWebService { 
    @Inject 
    UserService service; 

    @POST 
    @ApiOperation(value = "Register company", 
     notes = "A user account for company will be created.", 
     position = 1) 
    @Path("/register") 
    @Consumes("application/json") 
    @Produces("application/json") 
    public Boolean registerCompany(RegisterDTO register){ 
     Boolean result = false; 
     result = this.service.registerUser(register.email, register.password, UserType.COMPANY); 
     return result; 
    } 
} 

回答

0

經過一番嘗試&錯誤我想出一條出路,使之工作。爲了連接swagger-core,我從資源類的手動註冊切換到自動掃描和註冊。需要用例如web.xml將配置和初始化更改爲BeanConfig。一個servlet。

我不知道不同方法的(dis)優點,如果有的話 - 也許有人可以分享一些見解。

除此之外,這是我現在工作的解決方案:

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
     version="3.1"> 
    <display-name>service</display-name> 

    <servlet> 
     <servlet-name>javax.ws.rs.core.Application</servlet-name> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>javax.ws.rs.core.Application</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

    <context-param> 
     <param-name>resteasy.scan</param-name> 
     <param-value>true</param-value> 
    </context-param> 

    <servlet> 
     <servlet-name>SwaggerServlet</servlet-name> 
     <servlet-class>jfs.service.services.SwaggerServlet</servlet-class> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 
</web-app> 

SwaggerServlet.java

package jfs.service.services; 

import io.swagger.jaxrs.config.BeanConfig; 
import javax.servlet.ServletConfig; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 

public class SwaggerServlet extends HttpServlet { 
    @Override 
    public void init(ServletConfig config) throws ServletException { 
     super.init(config); 

     BeanConfig beanConfig = new BeanConfig(); 
     beanConfig.setVersion("1.0.0"); 
     beanConfig.setSchemes(new String[]{"http"}); 
     beanConfig.setHost("localhost:8080"); 
     beanConfig.setBasePath("/service"); 
     beanConfig.setResourcePackage("jfs.service.services"); 
     beanConfig.setScan(true); 
    } 
} 
相關問題