我正在使用以下技术:
我的后端托管各种类型的版本化REST API。我们有一个v1和v2 REST API上下文基本路径(/ api / v1和/ api / v2)。我们托管这两个不同API版本的方式是通过两种不同的Jersey资源配置(两个不同的servlet)。这一个Web应用程序部署到我们的Web应用程序服务器(我们使用Tomcat7)作为WAR文件。
我们所做的基本示例:
@ApplicationPath("/api/v2")
@Configuration
public class RestApiV2JerseyConfig extends ResourceConfig {
public RestApiV2JerseyConfig() {
...
register(ApiListingResource.class);
register(SwaggerSerializers.class);
}
@Bean
public void swaggerV2Bean() {
BeanConfig beanConfig = new BeanConfig();
beanConfig.setBasePath("/api/v2/);
beanConfig.setResourcePackage("com.example.rest.v2");
beanConfig.setScan(true);
return beanConfig;
}
}
@ApplicationPath("/api/v1")
@Configuration
public class RestApiV1JerseyConfig extends ResourceConfig {
public RestApiV1JerseyConfig() {
...
register(ApiListingResource.class);
register(SwaggerSerializers.class);
}
@Bean
public void swaggerV1Bean() {
BeanConfig beanConfig = new BeanConfig();
beanConfig.setBasePath("/api/v1/);
beanConfig.setResourcePackage("com.example.rest.v1");
beanConfig.setScan(true);
return beanConfig;
}
}
每个REST API都在上面的各种配置中相应注册。
现在,我希望能够为每个servlet托管Swagger。这是不可能的,对吗?当我尝试这样做时,Swagger配置会相互覆盖,每个端点都会返回相同的内容。含义https://ip-address/api/v1/swagger.json和https://ip-address/api/v2/swagger.json返回完全相同的响应(v1或v2 JSON,具体取决于首先注册的响应)。
所以看起来正在发生的是端点可以为每个servlet成功托管,但托管内容不能是每个servlet的唯一内容。或者,我可能只是把一些东西弄得很小而且还没有注意到。
各种事物的版本:
我在这里缺少什么?使用我提供的代码片段可以很容易地重现这一点。有没有其他人能够成功地做我想做的事情?
答案 0 :(得分:0)
是的,你可以这样做,但你需要使用web.xml servlet配置方法(至少,我还没弄明白如何以另一种方式做到这一点)。
BeanConfig更改:
在RestApiV1JerseyConfig中
beanConfig.setConfigId("v1");
beanConfig.setContextId("v1");
beanConfig.setScannerId("v1");
在RestApiV2JerseyConfig中
beanConfig.setConfigId("v2");
beanConfig.setContextId("v2");
beanConfig.setScannerId("v2");
web.xml(每个servlet一个):
<!-- v1 -->
<init-param>
<param-name>swagger.scanner.id</param-name>
<param-value>v1</param-value>
</init-param>
<init-param>
<param-name>swagger.config.id</param-name>
<param-value>v1</param-value>
</init-param>
<init-param>
<param-name>swagger.use.path.based.config</param-name>
<param-value>v1</param-value>
</init-param>
<!-- v2 -->
<init-param>
<param-name>swagger.scanner.id</param-name>
<param-value>v2</param-value>
</init-param>
<init-param>
<param-name>swagger.config.id</param-name>
<param-value>v2</param-value>
</init-param>
<init-param>
<param-name>swagger.use.path.based.config</param-name>
<param-value>v2</param-value>
</init-param>