swagger ui 与不显示 API 的 Maven 项目集成
swagger ui integration with maven project not displaying APIs
我有一个带有 REST API 的现有 Maven 项目。我正在尝试将 Swagger 与项目集成。当我 运行 项目时,我得到空的 Swagger UI 页面。没有加载 API。我哪里错了?
pom.xml
<!-- Swagger -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-jersey2-jaxrs</artifactId>
<version>1.5.16</version>
</dependency>
我正在使用自定义应用程序 class(不是 web.xml)
public class MyRestApplication extends ResourceConfig {
public MyRestApplication() {
System.out.println("Entering Custom Application");
property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
property(ServerProperties.
BV_DISABLE_VALIDATE_ON_EXECUTABLE_OVERRIDE_CHECK, true);
register(RolesAllowedDynamicFeature.class);
register(StorageResource.class);
register(io.swagger.jaxrs.listing.ApiListingResource.class);
register(io.swagger.jaxrs.listing.SwaggerSerializers.class);
}
}
在我的 StorageResource 文件中:
@Api(value = "/Person")
@Path("")
public class StorageResource {
static Logger logger =
Logger.getLogger(StorageResource.class.getName());
@PUT
@Path("/person-manager-resource/addPerson")
@Produces("application/json")
@Consumes("application/json")
@ApiOperation(
value = "method api",
notes = "method api notes"
)
public Object addPerson(String reqBody) {
AddPerson add = new AddPerson();
return add.addPerson(reqBody);
}
}
在Swagger的index.html中UI(从dist文件夹复制到webapp文件夹)
window.onload = function() {
// Build a system
const ui = SwaggerUIBundle({
url: "http://localhost:8080/demographics/dgs/swagger.json",
dom_id: '#swagger-ui',
presets: [
SwaggerUIBundle.presets.apis,
SwaggerUIStandalonePreset
],
plugins: [
SwaggerUIBundle.plugins.DownloadUrl
],
layout: "StandaloneLayout"
})
window.ui = ui
}
我的 web.xml 文件:
<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>in.healthelife.DGS</param-value>
</init-param>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>in.healthelife.DGS.data.MyRestApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/dgs/*</url-pattern>
</servlet-mapping>
update2
我不明白为什么你用了 2 org.glassfish.jersey.servlet.ServletContainer
它不起作用
通过在 web.xml
中提及,确保您提到您的自定义应用程序是通过 jersey 容器加载的
如下图
swagger-jersey2-jaxrs
dependency 就足够了,rest 会被 transitively pull。我不知道您使用的是哪个版本的球衣,但您必须扩展 ResourceConfig
才能自定义应用程序而不是 Application
class 本身
您必须在扩展资源配置中注册这 2 个功能
io.swagger.jaxrs.listing.ApiListingResource,
io.swagger.jaxrs.listing.SwaggerSerializers
并且您的自定义应用程序 class 必须在您的 web.xml 中提及
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.foo.app.CustomApplication
</param-value>
</init-param>
</servlet>
更新
url: "http://localhost:8080/OpenEMPIStorage/rest/api-docs",
最好是swagger.json的相对路径所以应该是这样
url: "swagger.json"
并确保您在路径 http://localhost:8080/OpenEMPIStorage/rest/api-docs
中进入的 json 已复制到此 swagger.json 文件
并且您在资源配置中的代码应该像
public MyRestApplication()
{
System.out.println("Entering Custom Application");
property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
// @ValidateOnExecution annotations on subclasses won't cause errors.
property(ServerProperties.BV_DISABLE_VALIDATE_ON_EXECUTABLE_OVERRIDE_CHECK, true);
register(RolesAllowedDynamicFeature.class);
register(AuthenticationFilter.class);
register(AuthenticationResponseFilter.class);
}
不要使用 @ApplicationPath
你的 Swagger.json 应该在休闲路径
下可用
http://<ip address:portname or domain name >/<yourapp-path>/dgs/swagger.json
我有一个带有 REST API 的现有 Maven 项目。我正在尝试将 Swagger 与项目集成。当我 运行 项目时,我得到空的 Swagger UI 页面。没有加载 API。我哪里错了?
pom.xml
<!-- Swagger -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-jersey2-jaxrs</artifactId>
<version>1.5.16</version>
</dependency>
我正在使用自定义应用程序 class(不是 web.xml)
public class MyRestApplication extends ResourceConfig {
public MyRestApplication() {
System.out.println("Entering Custom Application");
property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
property(ServerProperties.
BV_DISABLE_VALIDATE_ON_EXECUTABLE_OVERRIDE_CHECK, true);
register(RolesAllowedDynamicFeature.class);
register(StorageResource.class);
register(io.swagger.jaxrs.listing.ApiListingResource.class);
register(io.swagger.jaxrs.listing.SwaggerSerializers.class);
}
}
在我的 StorageResource 文件中:
@Api(value = "/Person")
@Path("")
public class StorageResource {
static Logger logger =
Logger.getLogger(StorageResource.class.getName());
@PUT
@Path("/person-manager-resource/addPerson")
@Produces("application/json")
@Consumes("application/json")
@ApiOperation(
value = "method api",
notes = "method api notes"
)
public Object addPerson(String reqBody) {
AddPerson add = new AddPerson();
return add.addPerson(reqBody);
}
}
在Swagger的index.html中UI(从dist文件夹复制到webapp文件夹)
window.onload = function() {
// Build a system
const ui = SwaggerUIBundle({
url: "http://localhost:8080/demographics/dgs/swagger.json",
dom_id: '#swagger-ui',
presets: [
SwaggerUIBundle.presets.apis,
SwaggerUIStandalonePreset
],
plugins: [
SwaggerUIBundle.plugins.DownloadUrl
],
layout: "StandaloneLayout"
})
window.ui = ui
}
我的 web.xml 文件:
<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>in.healthelife.DGS</param-value>
</init-param>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>in.healthelife.DGS.data.MyRestApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/dgs/*</url-pattern>
</servlet-mapping>
update2
我不明白为什么你用了 2 org.glassfish.jersey.servlet.ServletContainer
它不起作用
通过在 web.xml
中提及,确保您提到您的自定义应用程序是通过 jersey 容器加载的如下图
swagger-jersey2-jaxrs
dependency 就足够了,rest 会被 transitively pull。我不知道您使用的是哪个版本的球衣,但您必须扩展 ResourceConfig
才能自定义应用程序而不是 Application
class 本身
您必须在扩展资源配置中注册这 2 个功能
io.swagger.jaxrs.listing.ApiListingResource,
io.swagger.jaxrs.listing.SwaggerSerializers
并且您的自定义应用程序 class 必须在您的 web.xml 中提及
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.foo.app.CustomApplication
</param-value>
</init-param>
</servlet>
更新
url: "http://localhost:8080/OpenEMPIStorage/rest/api-docs",
最好是swagger.json的相对路径所以应该是这样
url: "swagger.json"
并确保您在路径 http://localhost:8080/OpenEMPIStorage/rest/api-docs
中进入的 json 已复制到此 swagger.json 文件
并且您在资源配置中的代码应该像
public MyRestApplication()
{
System.out.println("Entering Custom Application");
property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
// @ValidateOnExecution annotations on subclasses won't cause errors.
property(ServerProperties.BV_DISABLE_VALIDATE_ON_EXECUTABLE_OVERRIDE_CHECK, true);
register(RolesAllowedDynamicFeature.class);
register(AuthenticationFilter.class);
register(AuthenticationResponseFilter.class);
}
不要使用 @ApplicationPath
你的 Swagger.json 应该在休闲路径
下可用http://<ip address:portname or domain name >/<yourapp-path>/dgs/swagger.json