gpt4 book ai didi

java - 集成多个 Swagger2Feature 实例

转载 作者:太空宇宙 更新时间:2023-11-04 10:46:55 25 4
gpt4 key购买 nike

我正在尝试在 2 个不同的上下文中创建 2 个 Swagger 实例:

http://localhost:8080/app/rest1/swagger.json

http://localhost:8080/app/rest2/swagger.json

所以我有第一个工作正常的实例( http://localhost:8080/app/rest1/swagger.json ):

context1.xml

<context:component-scan base-package="org.app.rest.cxf.service"/>  

<bean id="swagger2customizer" class="org.apache.cxf.jaxrs.swagger.Swagger2Customizer">
<property name="dynamicBasePath" value="true"/>
<property name="replaceTags" value="true"/>
</bean>
<bean id="swagger2Feature" class="org.apache.cxf.jaxrs.swagger.Swagger2Feature">
<property name="title" value="Test"/>
<property name="version" value="1.0"/>
<property name="description" value="Test 1.0"/>
<property name="contact" value="dev@syncope.apache.org"/>

<property name="resourcePackage" value="org.app.rest.api.service"/>
<property name="scanAllResources" value="true"/>
<property name="activateOnlyIfJaxrsSupported" value="true"/>

<property name="customizer" ref="swagger2customizer"/>
</bean>

<jaxrs:server id="container" address="/"
basePackages="org.app.rest.api.service, org.app.rest.cxf.service"
staticSubresourceResolution="true">
<jaxrs:properties>
<entry key="search.lax.property.match" value="true"/>
<entry key="convert.wadl.resources.to.dom" value="false"/>
</jaxrs:properties>
<jaxrs:inInterceptors>
<ref bean="gzipInInterceptor"/>
<ref bean="validationInInterceptor"/>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="gzipOutInterceptor"/>
<ref bean="validationOutInterceptor"/>
</jaxrs:outInterceptors>
<jaxrs:providers>
<ref bean="dateParamConverterProvider"/>
<ref bean="jaxbProvider"/>
<ref bean="jsonProvider"/>
<ref bean="exceptionMapper"/>
<ref bean="searchContextProvider"/>
<ref bean="addDomainFilter"/>
<ref bean="addETagFilter"/>
<ref bean="wadlGenerator"/>
</jaxrs:providers>
<jaxrs:features>
<ref bean="swagger2Feature"/>
</jaxrs:features>
</jaxrs:server>

因此访问http://localhost:8080/app/rest1/swagger.json生成包含我所有端点的完整 json。我尝试配置第二个 Swagger,它引用了不同包下的其他服务:

context2.xml

<context:component-scan base-package="com.app2.rest.cxf.service"/>  

<bean id="swagger2customizer2" class="org.apache.cxf.jaxrs.swagger.Swagger2Customizer">
<property name="dynamicBasePath" value="true"/>
<property name="replaceTags" value="true"/>
</bean>
<bean id="swagger2Feature2" class="org.apache.cxf.jaxrs.swagger.Swagger2Feature">
<property name="title" value="Test"/>
<property name="version" value="1.0"/>
<property name="description" value="Test 1.0"/>
<property name="contact" value="dev@syncope.apache.org"/>

<property name="resourcePackage" value="com.app2.rest.api.service"/>
<property name="scanAllResources" value="true"/>
<property name="activateOnlyIfJaxrsSupported" value="true"/>

<property name="customizer" ref="swagger2customizer2"/>
</bean>

<jaxrs:server id="container" address="/"
basePackages="com.app2.rest.api.service, com.app2.rest.cxf.service"
staticSubresourceResolution="true">
<jaxrs:properties>
<entry key="search.lax.property.match" value="true"/>
<entry key="convert.wadl.resources.to.dom" value="false"/>
</jaxrs:properties>
<jaxrs:inInterceptors>
<ref bean="gzipInInterceptor"/>
<ref bean="validationInInterceptor"/>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="gzipOutInterceptor"/>
<ref bean="validationOutInterceptor"/>
</jaxrs:outInterceptors>
<jaxrs:providers>
<ref bean="dateParamConverterProvider"/>
<ref bean="jaxbProvider"/>
<ref bean="jsonProvider"/>
<ref bean="exceptionMapper"/>
<ref bean="searchContextProvider"/>
<ref bean="addDomainFilter"/>
<ref bean="addETagFilter"/>
<ref bean="wadlGenerator"/>
</jaxrs:providers>
<jaxrs:features>
<ref bean="swagger2Feature2"/>
</jaxrs:features>
</jaxrs:server>

web.xml

<servlet>
<servlet-name>AppSwaggerCXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<init-param>
<param-name>config-location</param-name>
<param-value>classpath*:/context2.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AppSwaggerCXFServlet</servlet-name>
<url-pattern>/sih/*</url-pattern>
</servlet-mapping>

问题在于第二个 URL http://localhost:8080/app/rest2/swagger.json生成一个 JSON,其中包含第一个 Swagger 配置包下的所有端点(因此在 org.app.rest.api.service 下,而不是在 com.app2.rest.api.service 下)。

你能帮我获得正确的配置吗?

谢谢

最佳答案

TL;博士:

添加您的 swagger2feature bean 配置:

<property name="usePathBasedConfig" value="true"/>

或者,如果您在配置 bean 中以编程方式创建 Swagger2Feature:

feature.setUsePathBasedConfig(Boolean.TRUE);

原因:

Swagger 检查模型基于 io.swagger.config.SwaggerConfig,为 Swagger 生成提供所有入口点规范和其他参数。 SwaggerConfig 在映射到 “config key”io.swagger.jaxrs.config.SwaggerConfigLocator 中进行管理,并从 io.swagger.jaxrs.config.SwaggerContextService 创建。

配置键的默认值为“swagger.config.id.default”,仅当 SwaggerContextServiceusePathBasedConfig 属性设置为 true 时才添加 API basePath。

CXF 的 Swagger2Feature 允许指定 SwaggerContextService 的属性,您已经了解了:“usePathBasedConfig” 的默认值为 false,这意味着所有 SwaggerConfig 都使用相同的键 “swagger.config.id.default” 放入 SwaggerConfigLocator 中,这意味着它们将被覆盖彼此。

通过在 Swagger2Feature 中启用此功能,可以独立管理配置,并且每个 Swagger 生成进程都可以很好地访问该配置。

我真的不知道为什么默认情况下不启用它,因为仅使用一个启用的入口点来管理它不是问题。

关于java - 集成多个 Swagger2Feature 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48304445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com