SOAP请求中whiteSpace=collapse配置无法触发空格修剪问题
问题原因
- CXF默认的XML Schema校验仅执行合法性校验逻辑,不会主动处理
whiteSpace约束对应的值转换规则。whiteSpace配置为collapse时需要执行的前后空格修剪、中间连续空格合并操作属于XML Schema的规范化处理范畴,默认未被CXF的@SchemaValidation注解启用。 - cxf-codegen-plugin生成Java类时,默认不会将Schema中的
whiteSpace约束转换为Java侧的序列化/反序列化处理逻辑,生成的对应字段为普通String类型,没有内置空格处理逻辑。 - 自定义
SchemaValidationHandler若仅实现了校验逻辑,没有额外添加规范化处理步骤,也不会触发空格修剪操作。
解决方案
方案1:启用CXF内置的Schema规范化开关
该方案改动最小,直接开启CXF的Schema值转换配置即可:
如果使用代码配置,直接在服务实现类上添加注解:
@org.apache.cxf.annotations.EndpointProperty(key = "org.apache.cxf.validation.schema.normalize", value = "true")
如果使用Spring配置,在服务端jaxws:endpoint节点下添加属性配置:
<jaxws:properties> <entry key="schema-validation-enabled" value="true" /> <entry key="org.apache.cxf.validation.schema.normalize" value="true" /> </jaxws:properties>
开启后CXF会在Schema校验阶段自动执行whiteSpace约束对应的转换逻辑。
方案2:通过cxf-codegen-plugin绑定自定义类型转换器
如果方案1不生效,可以通过绑定文件在代码生成阶段就给对应类型添加空格处理逻辑:
- 新建JAXB绑定文件
bindings.xjb:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.1"> <jaxb:bindings schemaLocation="你的Schema文件路径" node="/xsd:schema"> <jaxb:bindings node="xsd:simpleType[@name='DescriptionType']"> <jaxb:javaType name="java.lang.String" parseMethod="com.example.common.StringUtils.collapseWhitespace" printMethod="com.example.common.StringUtils.identity"/> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
- 在
cxf-codegen-plugin的配置中引入该绑定文件:
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>${cxf.version}</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <configuration> <wsdlOptions> <wsdlOption> <wsdl>你的wsdl路径</wsdl> <bindingFiles> <bindingFile>src/main/resources/bindings.xjb</bindingFile> </bindingFiles> </wsdlOption> </wsdlOptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> </plugin>
- 实现对应的工具类方法:
package com.example.common; public class StringUtils { public static String collapseWhitespace(String value) { if (value == null) return null; // 完全符合XML Schema collapse规则的实现 return value.trim().replaceAll("\\s+", " "); } public static String identity(String value) { return value; } }
方案3:自定义入站Handler处理
可以在现有HandlerChain中新增一个SOAP入站处理器,在请求进入业务逻辑之前,手动扫描所有DescriptionType类型的字段执行空格修剪操作。
内容的提问来源于stack exchange,提问作者anat0lius
相关产品推荐
相关产品推荐

