JDK11非Spring应用JAXB Marshaller设置CharacterEscapeHandler失败如何解决
JAXB CharacterEscapeHandler属性设置异常解决方案
问题根因
- 依赖冲突:同时引入
com.sun.xml.bind下的jaxb-core、jaxb-impl和org.glassfish.jaxb下的jaxb-runtime,导致类加载逻辑混乱,Marshaller实现与CharacterEscapeHandler接口不属于同一套版本体系 - 接口导入错误:2.3.x版本JAXB实现对应的CharacterEscapeHandler全类名为
com.sun.xml.bind.marshaller.CharacterEscapeHandler,你当前导入的org.glassfish.jaxb.core.marshaller.CharacterEscapeHandler属于更高版本JAXB的接口,类型不匹配 - 属性名配置错误:自定义实现类的全类名不能作为属性名使用,JAXB仅识别固定的属性名
修复步骤
步骤1:清理pom.xml依赖,移除冲突包
保留以下两个依赖即可,其余JAXB相关依赖全部删除:
<dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>2.3.3</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.3</version> </dependency>
步骤2:修改自定义转义处理器的接口导入
// 替换为2.3.x版本对应的正确接口 import com.sun.xml.bind.marshaller.CharacterEscapeHandler; import java.io.IOException; import java.io.Writer; public class CDATACharacterEscapeHandler implements CharacterEscapeHandler { @Override public void escape(char[] ch, int start, int length, boolean isAttVal, Writer writer) throws IOException { // 原有业务逻辑保持不变 } }
步骤3:修改Marshaller属性配置
Marshaller marshaller = JAXBContext.newInstance(Ratings.class).createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, schemaLocation); // 使用固定的属性名设置转义处理器 marshaller.setProperty("com.sun.xml.bind.characterEscapeHandler", new CDATACharacterEscapeHandler()); StringWriter writer = new StringWriter(); marshaller.marshal(ratings, writer); return writer.toString();
内容的提问来源于stack exchange,提问作者tjholmes66
相关产品推荐
相关产品推荐

