如何将 Swagger 无配置设置与 Jersey 2 集成 [英] How to integrate Swagger no config setup with Jersey 2

查看:40
本文介绍了如何将 Swagger 无配置设置与 Jersey 2 集成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用托管在 Tomcat 8.5 上的 Jersey 2 项目进行准系统 Swagger 设置.我首先使用 Jersey 入门指南 (https://jersey.github.io/documentation/latest/getting-started.html):

I'm trying to do a barebones Swagger setup with a Jersey 2 project hosted on Tomcat 8.5. I first generated the jersey project with the following snippet from the Jersey getting started guide (https://jersey.github.io/documentation/latest/getting-started.html):

mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-webapp
  -DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false
  -DgroupId=com.example -DartifactId=simple-service-webapp -Dpackage=com.example 
  -DarchetypeVersion=2.27

然后我从 swagger 入门指南中添加了 Swagger 依赖项(https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---入门):

Then I added the Swagger dependencies from the swagger getting started guide (https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Getting-started):

<dependency>
  <groupId>io.swagger.core.v3</groupId>
  <artifactId>swagger-jaxrs2</artifactId>
  <version>2.0.0</version>
</dependency>
<dependency>
  <groupId>io.swagger.core.v3</groupId>
  <artifactId>swagger-jaxrs2-servlet-initializer</artifactId>
  <version>2.0.0</version>
</dependency>

http://localhost:8080/simple-service- 访问 api 时webapp/webapi/myresource 我得到了正确的响应.当我点击 http://localhost:8080/simple-service-webapp/webapi/openapi.json 我得到一个 404 Not Found.

When hit the api at http://localhost:8080/simple-service-webapp/webapi/myresource I get the correct response. When I hit http://localhost:8080/simple-service-webapp/webapi/openapi.json I get a 404 Not Found.

有什么想法吗?

这是我的 pom 的样子:

Here's what my pom looks like:

<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/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>
<artifactId>simple-service-webapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>simple-service-webapp</name>

<build>
    <finalName>simple-service-webapp</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.5.1</version>
            <inherited>true</inherited>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey</groupId>
            <artifactId>jersey-bom</artifactId>
            <version>${jersey.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <!-- use the following artifactId if you don't need servlet 2.x compatibility -->
        <!-- artifactId>jersey-container-servlet</artifactId -->
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
    </dependency>
    <!-- uncomment this to get JSON support
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-binding</artifactId>
    </dependency>
    -->
    <dependency>
      <groupId>io.swagger.core.v3</groupId>
      <artifactId>swagger-jaxrs2</artifactId>
      <version>2.0.0</version>
    </dependency>
    <dependency>
      <groupId>io.swagger.core.v3</groupId>
      <artifactId>swagger-jaxrs2-servlet-initializer</artifactId>
      <version>2.0.0</version>
    </dependency>
</dependencies>
<properties>
    <jersey.version>2.27</jersey.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

推荐答案

你还是需要注册OpenApi 资源.这些是提供 JSON 的 JAX-RS 资源类.由于您使用 web.xml 进行配置,因此您只需将 swagger 包添加到要扫描的包列表中即可.

You still need to register the OpenApi resources. These are the JAX-RS resource classes that serve up the JSON. Since you are using web.xml for your configuration, you can simply add the swagger package to the list of packages to scan.

<servlet>
    <servlet-name>Jersey Web Application</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.example,
            io.swagger.v3.jaxrs2.integration.resources
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

请注意,我将 io.swagger.v3.jaxrs2.integration.resources 包添加到列表中,以逗号分隔.这将告诉 Jersey 扫描该包,它会发现并注册 AcceptHeaderOpenApiResourceOpenApiResource.两者的区别在于前者提供路径/openapi,数据格式由请求中的Accept头决定,后者提供路径/openapi.{type:json|yaml},其中数据格式由路径中的扩展名(.json或.yaml)决定.

Notice I added the io.swagger.v3.jaxrs2.integration.resources package to the list, delimited by comma. This will tell Jersey to scan that package, and it will discover and register both the AcceptHeaderOpenApiResource and the OpenApiResource. The difference between the two is that the former serves up the path /openapi and the data format is determined by the Accept header in the request, and the latter serves up the path /openapi.{type:json|yaml}, where the data format is determined by the extension (.json or .yaml) in the path.

这篇关于如何将 Swagger 无配置设置与 Jersey 2 集成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆