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

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不生效,可以通过绑定文件在代码生成阶段就给对应类型添加空格处理逻辑:

  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>
  1. 在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>
  1. 实现对应的工具类方法:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:57:03