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

