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

JDK11迁移至JDK17后Junit测试Jakarta Marshal编码异常求助

问题分析与解决方案

你遇到的是编码不一致导致的字符乱码问题:à变成à是典型的UTF-8字符被当作ISO-8859-1(或Windows-1252)解码的结果,核心原因是迁移到Jakarta JAXB后,Marshaller的默认编码行为发生了变化。

问题根源

在JDK11中,原javax.xml.bind.Marshaller默认使用UTF-8编码输出XML内容;但迁移到Jakarta JAXB(JDK17中已移除JDK自带的JAXB,使用独立的Jakarta实现)后,若未显式指定编码,Marshaller会采用JVM默认字符编码(可能是ISO-8859-1等非UTF-8编码),导致特殊字符编码错误。

解决方案

在创建Marshaller后,显式指定UTF-8编码即可解决问题:

try {
    final JAXBContext jaxbContext = getJaxbContext(classes);
    marshaller = jaxbContext.createMarshaller();
    // 显式设置XML输出编码为UTF-8
    marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
    marshaller.marshal(object, bos);
} catch (final JAXBException ex) {
    throw new HttpMessageConversionException(
        "Could not create Marshaller for class [" + classes + "]: " + ex.getMessage(), ex);
}

额外注意事项

如果后续需要将ByteArrayOutputStream转换为字符串,必须确保使用UTF-8解码,避免二次乱码:

import java.nio.charset.StandardCharsets;

// ...
String xmlString = new String(bos.toByteArray(), StandardCharsets.UTF_8);

通过显式指定编码,强制Marshaller以UTF-8输出XML内容,即可保证特殊字符的正确编码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:27:36