java - 无法使用 <url>/api-docs 访问 swagger 文档

标签 java rest jersey-2.0 swagger-2.0

我正在尝试使用 Jersey 和 swagger 构建 Hello World REST 服务来生成文档。 我能够成功调用其余方法,但是当我尝试通过调用访问 swagger 文档时:

http://localhost:8080/com.swagger.first/rest/api-docs

我收到“404 未找到”。 (我还尝试将 .json 添加到末尾)

我按照 this tutorial 中的步骤操作构建我的服务。

我的 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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>com.swagger.first</display-name>
<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>
            com.wordnik.swagger.jaxrs.json,
            com.swagger.first
        </param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>
            com.wordnik.swagger.jersey.listing.ApiListingResourceJSON,
            com.wordnik.swagger.jersey.listing.JerseyApiDeclarationProvider,
            com.wordnik.swagger.jersey.listing.JerseyResourceListingProvider
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</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/com.swagger.first/rest</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>

这是我的 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.swagger.first</groupId>
<artifactId>com.swagger.first</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <warSourceDirectory>WebContent</warSourceDirectory>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>com.wordnik</groupId>
        <artifactId>swagger-jersey2-jaxrs_2.10</artifactId>
        <version>1.3.12</version>
    </dependency>
</dependencies>

最后,这是我的服务类:

package com.swagger.first;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import io.swagger.annotations.*;


@Api( value="hello", description="HelloWrold service")
@Path("/hello")
public class HelloWorld {

@GET
@Produces(MediaType.TEXT_PLAIN)
@ApiOperation(value="Returns 'Hello World!!' string", notes="No comment")
@ApiResponse(code=200, message="Succeeded")
public String helloWorld(){
    return "Hello World!!";
}

@GET
@Produces(MediaType.APPLICATION_XML)
@ApiOperation(value="Returns 'Hello World!!' string as XML", notes="No comment")
@ApiResponses(value = {
        @ApiResponse(code=200, message="Succeeded"),
        @ApiResponse(code=400, message="Testing Swagger")
        })
public String helloWorldXml(){
    return "<hello> Hello World!! </hello>";
}

@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/echo")
@ApiOperation(value="Returns the query param", notes="No comment")
public String echoStringQueryParam(@ApiParam(name="s", value="any string", required=true) @QueryParam("s") String s){
    return s;
}
}

最佳答案

虽然这个解决方案来得很晚,但我希望它能为当前正在寻找此问题答案的人们派上用场。

您引用的 Jersey/Swagger 教程没有提到 Swagger 的用户界面不包含在 Maven 安装中。它的核心作用是生成一个 swagger.json 文件,可供 Swagger UI 使用

如果您正在寻找像此处显示的 API 文档:http://petstore.swagger.io/ ,

然后您需要安装以下 npm 包并将其内容复制到 java 项目中的 webapp 文件夹中。 https://www.npmjs.com/package/swagger-ui-dist

您的基本项目结构应如下所示:

enter image description here

您还需要编辑 index.html 文件,以便将其中定义的 url 变量链接到本地​​ swagger.json 文件,而不是默认设置的 petstore 示例。

就我而言,它看起来像这样:

 <script>
window.onload = function() {

  // Build a system
  const ui = SwaggerUIBundle({
    url: "http://localhost:8080/simple-service-webapp/api/swagger.json",
    dom_id: '#swagger-ui',
    deepLinking: true,
    presets: [
      SwaggerUIBundle.presets.apis,
      SwaggerUIStandalonePreset
    ],
    plugins: [
      SwaggerUIBundle.plugins.DownloadUrl
    ],
    layout: "StandaloneLayout"
  })

  window.ui = ui
}

部署后,当您在浏览器中访问应用程序的根 URL 时,您应该能够看到文档

关于java - 无法使用 <url>/api-docs 访问 swagger 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31774099/

相关文章:

java - 从 Jersey 2.26 中删除 AbstractContainerRequestValueFactory

java - SplitPane 布局问题

java - 具有多种类型的 REST PathParam

java - Logback 不会将日志写入文件

java - 将内容添加到 Couchdb 中的文档

java - REST Web 服务返回 415 - 不支持的媒体类型

java - 使用 jersey 和 grizzly 启用 JSON

java - 无法从 int 转换为 boolean。 Java 错误(新案例)

java - jsp中执行对象方法

带有 Jackson JSON 反序列化的 Jersey 2.6