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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:27:04