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
相关产品推荐
相关产品推荐

