我在 JDK11 上有一个使用 Spring Boot 2.7.11 的应用程序和一个使用 jaxb javax.xml.bind.Marshaller 的 Junit 测试。一切都好
但是我必须使用 Spring Boot 2.7.18 迁移到 JDK17。因此,我已将 javax.xml.bind 的所有导入替换为 jakarta.xml.bind。
之后,我的 Junit 测试失败了,因为 marshal 生成了带有错误编码字符的 XML 对象
try {
final JAXBContext jaxbContext = getJaxbContext(classes);
marshaller = jaxbContext.createMarshaller();
marshaller.marshal(object, bos);
} catch (final JAXBException ex) {
throw new HttpMessageConversionException(
"Could not create Marshaller for class [" + classes + "]: " + ex.getMessage(), ex);
}
在 marshaller.marshal(object, bos); 上,对象包含所有正确的字符,但在 marshaller 之后,charter ar 不正常
元帅之前:lorsDe=Retour à la maison
XML 中的 Marsha 后:
Retour à la maison
我不明白问题出在哪里。你能帮我吗?
从 javax.xml.bind 迁移到 jakarta.xml.bind 后,您似乎遇到了字符编码问题。在较新的版本中,默认设置可能会发生变化,从而影响编码行为。
尝试在 Marshaller 中显式设置编码:
try {
final JAXBContext jaxbContext = getJaxbContext(classes);
marshaller = jaxbContext.createMarshaller();
// Set encoding explicitly
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);
}
确保将“UTF-8”替换为您在应用程序中使用的适当编码。
此外,检查是否还有其他属性需要设置以兼容新版本。您可以参考您正在使用的 Jakarta XML Binding (JAXB) 实现的文档或发行说明来进行任何其他配置更改。