You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Apache CXF中配置Swagger UI的queryConfigEnabled参数?

问题解决:Swagger UI 4.x升级后显示默认Petstore API的修复方案

问题背景

部署在Tomcat的Web应用通过Apache CXF集成Swagger展示REST接口,升级Swagger UI到4.x.x版本后,访问URL http://host:port/webappname/doc/api-docs?url=/webappname/doc/openapi.json#/ 始终显示默认Petstore API。原因是Swagger UI 4.x出于安全考虑默认禁用从URL读取配置参数,导致url参数被忽略;手动设置queryConfigEnabled=true未生效,需要在Apache CXF的OpenApiFeature中正确配置SwaggerUiConfig。

解决方案

方案1:在web.xml中直接配置OpenApiFeature(符合需求的配置示例)

修改RestAPIDoc servlet的配置,通过CXF的特性参数配置方式,直接为OpenApiFeature设置SwaggerUiConfig的属性:

<servlet>
    <display-name>REST API Documentation</display-name>
    <servlet-name>RestAPIDoc</servlet-name>
    <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
    <init-param>
        <param-name>jaxrs.serviceClasses</param-name>
        <param-value>com.abc.xyz.AgentManagerService</param-value>
    </init-param>
    <init-param>
        <param-name>jaxrs.features</param-name>
        <param-value>org.apache.cxf.jaxrs.openapi.OpenApiFeature</param-value>
    </init-param>
    <!-- 启用从URL读取配置参数 -->
    <init-param>
        <param-name>jaxrs.features.org.apache.cxf.jaxrs.openapi.OpenApiFeature.swaggerUiConfig.queryConfigEnabled</param-name>
        <param-value>true</param-value>
    </init-param>
    <!-- 配置默认OpenAPI文档地址(可选,避免依赖URL参数) -->
    <init-param>
        <param-name>jaxrs.features.org.apache.cxf.jaxrs.openapi.OpenApiFeature.swaggerUiConfig.url</param-name>
        <param-value>/oemanager/doc/openapi.json</param-value>
    </init-param>
    <init-param>
        <param-name>jaxrs.providers</param-name>
        <param-value>
            org.apache.cxf.jaxrs.provider.MultipartProvider,
            com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

方案2:修正MyApp类的配置(代码层面配置)

原MyApp类中在getSingletons方法添加OpenApiFeature,可能与RestAPIDoc servlet中配置的OpenApiFeature冲突,导致配置不生效。建议只保留一处配置,修改MyApp类如下:

public class MyApp extends Application {
    private Set<Object> singletons = new HashSet<Object>();
    private Set<Class<?>> classes = new HashSet<Class<?>>();

    public MyApp() throws ServletException {
        try {
            singletons.add(new JSONProvider());
            singletons.add(new WARProvider());

            Context m_context = getNamingContext();
            
            RestTransportManagerService restTransportManagerService = new RestTransportManagerService(m_context);
            singletons.add(restTransportManagerService);

            SoapTransportManagerService soapTransportManagerService = new SoapTransportManagerService(m_context);
            singletons.add(soapTransportManagerService);

            AgentManagerService agentManagerService = new AgentManagerService();
            singletons.add(agentManagerService);

            // 初始化OpenApiFeature并配置SwaggerUiConfig
            final OpenApiFeature feature = new OpenApiFeature(); 
            feature.setSwaggerUiConfig(
                new SwaggerUiConfig()
                    .url("/oemanager/doc/openapi.json") 
                    .queryConfigEnabled(true)
            );
            singletons.add(feature);

        } catch (Exception e) {
            throw new ServletException(e.getMessage());
        }
    }

    private Context getNamingContext() throws NamingException{
        Context m_context = new InitialContext();
        return m_context.lookup("java:comp/env");
    }

    @Override
    public Set<Class<?>> getClasses() {
        return classes;
    }

    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }
}

同时删除RestAPIDoc servlet中的jaxrs.features配置项,避免重复加载OpenApiFeature。

注意事项

  • 若使用方案1,确保CXF版本为3.4.0及以上(该版本支持通过init-param配置Feature的嵌套属性),当前3.5.1版本满足要求。
  • queryConfigEnabled=true存在安全风险,生产环境建议直接配置默认的url属性,避免依赖URL参数传递API地址。

内容的提问来源于stack exchange,提问作者Austin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:09:45