繁体   English   中英

解组两个 XML 字符串时 JAXB 出现奇怪错误,一个成功,另一个失败并出现 JAXBException:未找到 JAXB-API 的实现

[英]Weird error with JAXB when unmarshalling two XML strings, one succeeds and the other fails with JAXBException: Implementation of JAXB-API not found

我正在开发一个使用 Spring Boot (v.2.7.5) 和 Java 17 构建的项目,该项目必须处理 XML。 它从一大堆 XSD 文件中生成源代码,并使用 API 将 XML 上传到第三方。 它必须使用名称空间等处理 XML 的编组和解组。但这不是问题。

应用程序的一部分是从磁盘中获取文件,解组为 Java 对象,这是生成的类类型之一,然后使用其中一个设置器将一些信息添加到对象,然后是 xml 内容使用 API 上传到第三方。

问题是,当应用程序几乎同时有两个文件要解组时(它们由 Spring Boot 作为单独的计划作业处理,因此它们不在同一个函数或类似的函数中处理)其中一个成功,另一个(第二个在正在处理的订单)抛出异常:

javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
...
Caused by: java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
    at javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:92)
    at javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:125)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:230)

这超级奇怪? 如果 JAXB-API 实现不在类路径中,它怎么能成功一次呢?!

该应用程序是使用 Gradle 构建的,build.gradle 包含以下内容:

dependencies {
    ....

    // JAXB
    implementation "javax.xml.bind:jaxb-api:2.3.1"
    runtimeOnly "com.sun.xml.bind:jaxb-impl:2.3.3"
}

很明显 JAXB-API 的实现在类路径中!

我已经尝试了所有不同的实现,Glassfish、EclipseLink MOXy 等各种版本,都存在相同的问题。

更奇怪的是,当我在我的 IDE 中运行应用程序时,我没有收到此错误。 当应用程序被打包到 Docker 容器中时(它在生产中的 Kubernetes 集群中运行),我得到了它。

有没有人遇到过这样的事情?

事实证明,编组器和解组器对于 JAXB 不是线程安全的,如下所述: https ://javaee.github.io/jaxb-v2/doc/user-guide/ch06.html#d0e6879

我还更新了 jaxb-impl 的 2.3.7 版,这可能对正在解决的问题没有真正的影响,但我想把它扔在那里以防万一。

解决方案是每次都创建一个新的解组器,并在非静态方法中完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM