当前位置: 首页 > 知识库问答 >
问题:

多个Swagger2Feature实例的集成

后安民
2023-03-14

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

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

<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>
<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,所有endpoint都在第一个Swagger配置的包下(所以在org.app.rest.api.service下,而不是com.app2.rest.api.service)。

你能帮我弄个正确的配置吗?

谢谢

共有1个答案

惠志
2023-03-14

TL;DR:

添加您的swagger2feature bean配置:

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

或者在配置bean中创建Swagger2Feature编程:

feature.setUsePathBasedConfig(Boolean.TRUE);

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

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

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

 类似资料:
  • 问题内容: 大多数人似乎建议在不同的端口(6379和6380)上运行单独的Redis实例。为什么在创建第二个数据库时更通常建议这样做?我还没有完全阅读文档,但是大多数示例在连接时并未真正提及“选择Redis数据库”。Ruby客户端的一个示例,nrk / predis的自述文件: 目前,我们正在使用Campfire在办公室中运行Hubot,而我正在为GTalk工作第二个,因为每个Hubot实例只能使

  • 问题内容: 我想在 多个线程* (每个CPU内核一个)中使用 scipy.integrate.ode (或scipy.integrate.odeint)实例,以便一次解决多个IVP。但是文档中说:“此集成器不可重入。您不能同时使用“vode”集成器拥有两个ode实例。 ” * __ (尽管文档未说明,但如果多次实例化,odeint也会导致内部错误。) 知道该怎么办吗? 问题答案: 一种选择是使用(

  • 当我试图创建多个实例时,我遇到了一个问题。 例如: 控制台日志:,仅此而已。不再有了。

  • 我们目前在办公室用营火运行Hubot,我正在为GTalk开发第二个适配器,因为每个Hubot实例只能使用一个适配器。因此,我正在考虑创建第二个Redis数据库或实例,以便隔离两个hubots之间的数据。但是在我深入讨论之前,我想了解为什么要使用单独的实例而不是创建第二个数据库。

  • 我正在将Vue集成到一个表单网站上,这意味着如果页面上有多个表单,我必须创建Vue应用程序的几个实例。所有实例共享相同的Vuex存储。 我创建了一个Vuex模块,这样每个Vue实例都可以有自己的本地状态。我的主要目标是防止一个Vue实例更新另一个Vue实例的状态。 这是我的Vuex模块 创建我的Vuex实例: 我正在阅读Vuex文档,它说你需要使用一个返回模块状态的函数,这就是我正在做的。但是,当

  • 有人能解释一下下面的代码是如何毫无例外地工作的吗。我在想,当为星期天创建新实例时,它也会为星期一(星期天内)创建一个新实例,然后再为星期天(星期一内)创建一个新实例,以此类推。。。类似递归的东西,因为它们都是课程周的一部分。但我的理解是错误的,因为下面的代码运行良好。 我有这个疑问,当我读到java枚举。