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

