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

迁移org.springframework.oxm.xmlbeans.XmlBeansMarshaller至最新版本的方案咨询

Spring OXM升级后XmlBeansMarshaller缺失的迁移方案

问题背景

原有依赖(Spring 4.x + CXF 3.x):

implementation 'org.springframework:spring-oxm:4.1.7.RELEASE'
implementation "org.apache.cxf:cxf-rt-frontend-jaxws:3.4.2"

对应代码:

import org.springframework.oxm.xmlbeans.XmlBeansMarshaller;

@Bean
public HttpMessageConverter<Object> createXmlHttpMessageConverterSettings() {
    MarshallingHttpMessageConverter xmlConverter = new MarshallingHttpMessageConverter();
    XmlBeansMarshaller marshaller = new XmlBeansMarshaller();
    // 原有配置逻辑
    xmlConverter.setMarshaller(marshaller);
    xmlConverter.setUnmarshaller(marshaller);

    return xmlConverter;
}

升级到Spring 6.x + CXF 4.x后:

implementation 'org.springframework:spring-oxm:6.1.10'
implementation 'org.apache.cxf:cxf-rt-frontend-jaxws:4.0.4'

发现org.springframework.oxm.xmlbeans.XmlBeansMarshaller类已被移除,无法正常编译。

原因说明

Spring从5.x版本开始移除了对XmlBeans的内置支持,因为XmlBeans项目已停止维护,Spring官方不再提供对应的Marshaller实现。同时Spring 6.x仅支持Jakarta EE API,进一步剥离了老旧的第三方依赖支持。

迁移方案

方案一:改用JAXB Marshaller(推荐)

如果业务场景允许,优先使用Spring内置的JAXB实现,无需额外引入XmlBeans依赖:

依赖调整

无需新增额外依赖,Spring OXM 6.x已内置JAXB支持(JDK9+需手动引入以下依赖):

implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0'
implementation 'com.sun.xml.bind:jaxb-impl:4.0.4'

代码修改

import org.springframework.oxm.jaxb.Jaxb2Marshaller;

@Bean
public HttpMessageConverter<Object> createXmlHttpMessageConverterSettings() {
    MarshallingHttpMessageConverter xmlConverter = new MarshallingHttpMessageConverter();
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    // 配置JAXB上下文路径,指定需要序列化的类所在包
    marshaller.setContextPath("com.your.package");
    // 其他自定义配置(如命名空间、验证规则等)

    xmlConverter.setMarshaller(marshaller);
    xmlConverter.setUnmarshaller(marshaller);

    return xmlConverter;
}

方案二:自行封装XmlBeans的Marshaller/Unmarshaller(必须保留XmlBeans时)

如果业务必须依赖XmlBeans,需要手动实现Spring的Marshaller和Unmarshaller接口:

依赖调整

添加XmlBeans官方依赖:

implementation 'org.apache.xmlbeans:xmlbeans:5.1.1'

自定义XmlBeansMarshaller实现

import org.springframework.oxm.Marshaller;
import org.springframework.oxm.Unmarshaller;
import org.springframework.oxm.XmlMappingException;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;

import javax.xml.transform.Result;
import javax.xml.transform.Source;
import java.io.IOException;

public class CustomXmlBeansMarshaller implements Marshaller, Unmarshaller {

    private XmlOptions xmlOptions = new XmlOptions();

    // 自定义XmlOptions配置方法
    public void setXmlOptions(XmlOptions xmlOptions) {
        this.xmlOptions = xmlOptions;
    }

    @Override
    public void marshal(Object graph, Result result) throws XmlMappingException, IOException {
        if (!(graph instanceof XmlObject)) {
            throw new XmlMappingException("仅支持XmlObject类型实例");
        }
        try {
            ((XmlObject) graph).save(result, xmlOptions);
        } catch (Exception e) {
            throw new XmlMappingException("XmlObject序列化失败", e);
        }
    }

    @Override
    public Object unmarshal(Source source) throws XmlMappingException, IOException {
        try {
            return XmlObject.Factory.parse(source, xmlOptions);
        } catch (Exception e) {
            throw new XmlMappingException("XmlObject反序列化失败", e);
        }
    }

    @Override
    public boolean supports(Class<?> clazz) {
        return XmlObject.class.isAssignableFrom(clazz);
    }
}

替换原有Bean配置

@Bean
public HttpMessageConverter<Object> createXmlHttpMessageConverterSettings() {
    MarshallingHttpMessageConverter xmlConverter = new MarshallingHttpMessageConverter();
    CustomXmlBeansMarshaller marshaller = new CustomXmlBeansMarshaller();
    // 配置XmlOptions,例如设置格式化输出、命名空间等
    XmlOptions xmlOptions = new XmlOptions();
    xmlOptions.setSavePrettyPrint();
    marshaller.setXmlOptions(xmlOptions);

    xmlConverter.setMarshaller(marshaller);
    xmlConverter.setUnmarshaller(marshaller);

    return xmlConverter;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:40:56