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

Apache CXF 3.1.8如何关闭Codegen-cxf-plugin及SOAP客户端Schema验证

关闭CXF SOAP客户端的WSDL/XSD验证

我刚好处理过类似的需求,给你几个可行的方案,根据你的代码场景来选:

1. 编程式配置(最适配你的初始化代码)

既然你是手动创建WsProviderService实例,直接通过CXF的Client接口修改配置是最直接的方式。修改你的初始化代码如下:

private static WsProviderPortType lkService = null;
WsProviderService lk = new WsProviderService(new URL(AppConfig.getConfig().getProperty("lk.service")));
lkService = lk.getWsProviderPort();

// 获取CXF底层的Client实例
Client client = ClientProxy.getClient(lkService);
HTTPConduit conduit = (HTTPConduit) client.getConduit();

// 核心配置:关闭验证并阻止WSDL重新加载
conduit.getClient().setSchemaValidationEnabled(false); // 关闭XSD Schema验证
conduit.getClient().setWsdlURL(null); // 告诉CXF不要尝试下载/刷新远程WSDL

// 可选:额外优化,避免不必要的网络请求
conduit.getClient().setCacheWSDL(true);
conduit.getClient().setAutoRedirect(false);

解释一下:生成的客户端代码已经包含了WSDL的静态元数据,所以setWsdlURL(null)会阻止CXF在运行时重新拉取远程WSDL;setSchemaValidationEnabled(false)则直接关闭请求/响应的XSD校验。

2. 注解方式(需配合代码生成配置)

如果想通过注解实现,你可以给生成的WsProviderPortType接口添加@EndpointProperty注解,但注意不能直接在你的业务代码里加,需要在代码生成阶段配置,或者手动修改生成的接口文件:

手动修改生成的接口

import javax.xml.ws.EndpointProperty;
import javax.jws.WebService;

@WebService(name = "WsProviderPortType", targetNamespace = "你的目标命名空间")
@EndpointProperty(key = "schema-validation-enabled", value = "false")
@EndpointProperty(key = "wsdl-url", value = "")
public interface WsProviderPortType {
    // 你的SOAP方法定义
}

自动生成时添加注解(推荐)

为了避免每次重新生成代码都要手动修改,可以在Codegen-cxf-plugin的配置里添加绑定文件:

在你的pom.xml的插件配置中加入:

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <!-- 版本号 -->
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
            <configuration>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>你的WSDL路径</wsdl>
                        <bindingFiles>
                            <bindingFile>jaxws-bindings.xml</bindingFile>
                        </bindingFiles>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
        </execution>
    </executions>
</plugin>

然后创建jaxws-bindings.xml文件放在项目资源目录下:

<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                wsdlLocation="你的WSDL路径">
    <!-- 匹配你的PortType名称 -->
    <jaxws:bindings node="wsdl:definitions/wsdl:portType[@name='WsProviderPortType']">
        <jaxws:endpointProperty name="schema-validation-enabled" value="false"/>
        <jaxws:endpointProperty name="wsdl-url" value=""/>
    </jaxws:bindings>
</jaxws:bindings>

这样每次生成代码时,接口就会自动带上这些注解,无需手动修改。

3. 配置文件方式(适合Spring集成场景)

如果你的项目用Spring管理Bean,可以在cxf.xml中配置客户端属性:

<jaxws:client id="lkService"
              serviceClass="com.yourpackage.WsProviderPortType"
              address="${lk.service}">
    <jaxws:properties>
        <entry key="schema-validation-enabled" value="false"/>
        <entry key="wsdl-url" value=""/>
    </jaxws:properties>
</jaxws:client>

不过这种方式更适合依赖注入的场景,和你当前手动初始化的代码匹配度不高,仅供参考。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:27:57