Java 迁移 JDK 11 到 JDK 17 未能通过 Jakarta Marshal 进行 Junit 测试

问题描述 投票:0回答:1

我在 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

我不明白问题出在哪里。你能帮我吗?

java xml jakarta-ee encoding marshalling
1个回答
0
投票

从 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) 实现的文档或发行说明来进行任何其他配置更改。

© www.soinside.com 2019 - 2024. All rights reserved.