【问题标题】:swagger jersey REST API doesn't work招摇球衣 REST API 不起作用
【发布时间】:2014-11-26 18:43:35
【问题描述】:

我按照步骤将 Swagger 添加到我已经在 TOMCAT 中构建的 Jersey REST API 项目中

  1. 添加:
swagger-annotations-1.3.10.jar
swagger-core_2.10-1.3.10.jar
swagger-jaxrs_2.10-1.3.10.jar
swagger-jersey2-jaxrs_2.10-1.3.10.jar
  1. 在 web.xml 中添加

    上下文类 org.springframework.web.context.support.AnnotationConfigWebApplicationContext 上下文配置位置 com.estartup.config.PersistenceConfig

    <!-- Bootstrap the root application context as usual using ContextLoaderListener -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    
    <servlet>
        <servlet-name>jersey-servlet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.estartup.config.Application</param-value>
        </init-param>
    
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>jersey-servlet</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>
    
    <servlet>
        <servlet-name>Jersey2Config</servlet-name>
        <servlet-class>com.wordnik.swagger.jersey.config.JerseyJaxrsConfig</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/api</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    

应用类:

public class Application extends ResourceConfig {

    @Inject
    public Application(ServiceLocator serviceLocator) {
        register(new ServiceBinder());
        register(com.estartup.feature.JacksonFeature.class);            
        packages(true, "com.estartup", "com.wordnik.swagger.jaxrs.json","com.wordnik.swagger.jersey.listing");

    }

}

但是,当我导航到

http://localhost:8080/api/api-docs我得到HTTP Status 404 - page not found.

:(。在日志中,我确实看到 swagger 是这样加载的: 怎么了?

15935 DEBUG [localhost-startStop-1] com.wordnik.swagger.jaxrs.config.WebXMLReader - set api.version to 1.0.0
15935 DEBUG [localhost-startStop-1] com.wordnik.swagger.jaxrs.config.WebXMLReader - set swagger.api.basepath to http://localhost:8080/api

【问题讨论】:

  • 这是使用 Jetty 还是其他应用服务器部署的?
  • 谢谢我正在使用tomcat

标签: java jersey swagger swagger-ui


【解决方案1】:

试试这个配置:

pom.xml:

...
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-jersey2-jaxrs</artifactId>
    <version>1.5.0</version>
</dependency>
...

web.xml:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
    <display-name>ProjectName</display-name>

    <servlet>
        <servlet-name>jersey-servlet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>your.package.name.YourApplication</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>jersey-servlet</servlet-name>
        <url-pattern>/rs/*</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>SwaggerBootstrap</servlet-name>
        <servlet-class>your.package.name.SwaggerApplication</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>

</web-app>

SwaggerApplication.java:

public class SwaggerApplication extends HttpServlet {

    private static final long serialVersionUID = -6039834823506457822L;

    @Override
    public void init(ServletConfig config) throws ServletException {

        super.init(config);

        BeanConfig beanConfig = new BeanConfig();

        final String contextPath = config.getServletContext().getContextPath();
        final StringBuilder sbBasePath = new StringBuilder(); 
        sbBasePath.append(contextPath);
        sbBasePath.append("/rs");
        beanConfig.setBasePath(sbBasePath.toString());

        // API Info
        beanConfig.setVersion("0.1");
        beanConfig.setTitle("My Swagger APP");
        beanConfig.setResourcePackage("your.package.name");
        beanConfig.setScan(true);
    }
}

要访问您的 Swagger JSON:http://&lt;your-app&gt;/&lt;your-context&gt;/rs/swagger.json

【讨论】:

    【解决方案2】:

    根据您的评论,如果您的应用程序部署在 Tomcat 上,那么这很可能是错误的 URL。

    假设您的应用程序的上下文根是 myapp,那么您的 API 本身将部署在 http://localhost:8080/myapp/api/... 上,同样地,swagger 文档将在 http://localhost:8080/myapp/api/api-docs 上可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-02
      • 2016-06-04
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      相关资源
      最近更新 更多