带有 ResourceConfig 的 Swagger Core Jersey 2.X
Swagger Core Jersey 2.X with ResourceConfig
我正在尝试为我的应用程序添加 swagger。
但我将 Jersey 配置为 ResourceConfig,如下所示:
@ApplicationPath("/resources/api")
public class ApiApplication extends ResourceConfig {
public ApiApplication() {
super(MultiPartFeature.class);
packages("my.rest.resources");
register(io.swagger.jaxrs.listing.ApiListingResource.class);
register(io.swagger.jaxrs.listing.SwaggerSerializers.class);
BeanConfig beanConfig = new BeanConfig();
beanConfig.setVersion("1.0.2");
beanConfig.setSchemes(new String[]{"http"});
beanConfig.setHost("localhost:8080");
beanConfig.setBasePath("/resources/api");
beanConfig.setResourcePackage("my.rest.resources");
beanConfig.setScan(true);
}
}
这是正确的吗?
没有swagger.json生成。
据我了解swagger文件应该在下面link http://localhost/api/api-docs/swagger.json
已更新:
已将 BasePath 更改为 resources/api
我也在 tomcat 日志中得到以下异常:
SEVERE: Servlet /XXXXXX threw load() exception
java.lang.NoSuchMethodError: org.reflections.util.ClasspathHelper.forPackage(Ljava/lang/String;[Ljava/lang/ClassLoader;)Ljava/util/Collection;
at io.swagger.jaxrs.config.BeanConfig.classes(BeanConfig.java:189)
at io.swagger.jaxrs.config.BeanConfig.setScan(BeanConfig.java:168)
at my.rest.resources.apps.ApiApplication.<init>(ApiApplication.java:34)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
ApiListingResource
(swagger 数据的来源)只不过是另一个 JAX-RS(泽西岛)资源 class.
@Path("/")
public class ApiListingResource {
...
@GET
...
@Path("/swagger.{type:json|yaml}")
public Response getListing(..) {...}
...
}
因此资源路径将是基础 @ApplicationPath("/resources/api")
和 swagger 资源路径 /swagger.json
。所以你需要访问 /resources/api/swagger.json
.
您需要在 BeanConfig
中修复您的基本路径。此基本路径用于为 swagger UI 创建 URLs。使用基本路径 "/api"
意味着 URL 数据将导致 UI 访问不存在的 /api/yourresource
。基本路径应该是 servlet 上下文(我猜你的情况是 none)和 Jersey 基本路径(/resources/api
)的组合。所以将 BeanConfig
基本路径设置为 "/resources/api"
java.lang.NoSuchMethodError: org.reflections.util.ClasspathHelper.forPackage(Ljava/lang/String;[Ljava/lang/ClassLoader;)Ljava/util/Collection;
在 io.swagger.jaxrs.config.BeanConfig.classes(BeanConfig.java:189)
在 io.swagger.jaxrs.config.BeanConfig.setScan(BeanConfig.java:168)
在 my.rest.resources.apps.ApiApplication.(ApiApplication.java:34)
在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
通过上面的堆栈跟踪,观察到如下:
实际上您正在使用 Jersey1.x 支持的 jar,即 reflections-0.9.9-RC1.jar,因此将 Jersey 2.x 支持的 jar reflections-0.9.9.jar 添加到你的 libs 文件夹或类路径。这将解决上述问题
我正在尝试为我的应用程序添加 swagger。
但我将 Jersey 配置为 ResourceConfig,如下所示:
@ApplicationPath("/resources/api")
public class ApiApplication extends ResourceConfig {
public ApiApplication() {
super(MultiPartFeature.class);
packages("my.rest.resources");
register(io.swagger.jaxrs.listing.ApiListingResource.class);
register(io.swagger.jaxrs.listing.SwaggerSerializers.class);
BeanConfig beanConfig = new BeanConfig();
beanConfig.setVersion("1.0.2");
beanConfig.setSchemes(new String[]{"http"});
beanConfig.setHost("localhost:8080");
beanConfig.setBasePath("/resources/api");
beanConfig.setResourcePackage("my.rest.resources");
beanConfig.setScan(true);
}
}
这是正确的吗?
没有swagger.json生成。
据我了解swagger文件应该在下面link http://localhost/api/api-docs/swagger.json
已更新:
已将 BasePath 更改为 resources/api
我也在 tomcat 日志中得到以下异常:
SEVERE: Servlet /XXXXXX threw load() exception
java.lang.NoSuchMethodError: org.reflections.util.ClasspathHelper.forPackage(Ljava/lang/String;[Ljava/lang/ClassLoader;)Ljava/util/Collection;
at io.swagger.jaxrs.config.BeanConfig.classes(BeanConfig.java:189)
at io.swagger.jaxrs.config.BeanConfig.setScan(BeanConfig.java:168)
at my.rest.resources.apps.ApiApplication.<init>(ApiApplication.java:34)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
ApiListingResource
(swagger 数据的来源)只不过是另一个 JAX-RS(泽西岛)资源 class.@Path("/") public class ApiListingResource { ... @GET ... @Path("/swagger.{type:json|yaml}") public Response getListing(..) {...} ... }
因此资源路径将是基础
@ApplicationPath("/resources/api")
和 swagger 资源路径/swagger.json
。所以你需要访问/resources/api/swagger.json
.您需要在
BeanConfig
中修复您的基本路径。此基本路径用于为 swagger UI 创建 URLs。使用基本路径"/api"
意味着 URL 数据将导致 UI 访问不存在的/api/yourresource
。基本路径应该是 servlet 上下文(我猜你的情况是 none)和 Jersey 基本路径(/resources/api
)的组合。所以将BeanConfig
基本路径设置为"/resources/api"
java.lang.NoSuchMethodError: org.reflections.util.ClasspathHelper.forPackage(Ljava/lang/String;[Ljava/lang/ClassLoader;)Ljava/util/Collection; 在 io.swagger.jaxrs.config.BeanConfig.classes(BeanConfig.java:189) 在 io.swagger.jaxrs.config.BeanConfig.setScan(BeanConfig.java:168) 在 my.rest.resources.apps.ApiApplication.(ApiApplication.java:34) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
通过上面的堆栈跟踪,观察到如下:
实际上您正在使用 Jersey1.x 支持的 jar,即 reflections-0.9.9-RC1.jar,因此将 Jersey 2.x 支持的 jar reflections-0.9.9.jar 添加到你的 libs 文件夹或类路径。这将解决上述问题