【问题标题】:Integration of multiple Swagger2Feature instances多个 Swagger2Feature 实例的集成
【发布时间】:2018-03-08 01:41:14
【问题描述】:

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

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 下)。

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

谢谢

【问题讨论】:

  • 我们的项目面临着完全相同的问题。你最终以某种方式解决了这个问题吗?谢谢

标签: java xml cxf swagger


【解决方案1】:

TL;DR:

添加你的 swagger2feature bean 配置:

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

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

feature.setUsePathBasedConfig(Boolean.TRUE);

为什么:

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

config 键的默认值为 "swagger.config.id.default"只有在 usePathBasedConfig 属性为SwaggerContextService 设置为 true

来自 CXF 的 Swagger2Feature 允许指定 SwaggerContextService 的属性,你已经明白了:"usePathBasedConfig" 的默认值为 false ,意味着所有的 SwaggerConfig 都被放入具有相同键 "swagger.config.id.default"SwaggerConfigLocator 中,意味着它们被覆盖彼此。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多