【问题标题】:JAXB's XML annotations work with JDK8 but throw MessageBodyWriter not found with JDK11 [duplicate]JAXB 的 XML 注释适用于 JDK8,但在 JDK11 中找不到 MessageBodyWriter [重复]
【发布时间】:2019-06-14 17:18:48
【问题描述】:

在开发 JAX-RS (Jersey) 应用程序时,我使用 @XmlRootElement@XmlElement 启用 XML 媒体类型作为响应主体。

例外:
21-Jan-2019 12:29:28.601 SEVERE [http-nio-8080-exec-4] org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo MessageBodyWriter not found for media type=text/plain, type=class org.mypack.model.Message, genericType=class org.mypack.model.Message.

有什么建议吗?

【问题讨论】:

  • 类路径、模块路径或模块。更多细节(如异常)可能会有所帮助。
  • 我已经说了原因,但是好的,现在我已经添加了跟踪。有帮助吗?
  • 您是否知道 JAXB 已从 JDK 11 中删除,并且您需要自己将其添加到您的类路径中?是你做的吗?您的问题严重缺乏相关信息。
  • 是的,我是,我将它添加到类路径中。感谢您的评论,但我想说,如果有人问有关 JAXB 的问题,则应该知道什么是类路径。它编译并运行.. 例外是运行时。
  • @Andreas,顺便说一句,您是否知道即使使用 jdk11 也一切正常,而问题不在于 jdk?请不要在你的 cmets 中使用否定的“我什么都知道”的语气,拜托。谢谢。

标签: java xml jaxb jax-rs


【解决方案1】:

解决方案

我听说很多人有这个问题/疑问,所以我认为我找到的解决方案会更好地分享,我什至会详细解释一下:

我正在考虑这个问题的两个不同点:

  1. jdk 版本 用于构建(编译)项目;
  2. jdk 版本,用于您将在其上运行项目的 Web 容器 (Tomcat)(在 IntelliJ 中,它位于运行/调试配置下,您必须为您的服务器指定 jdk)。李>

我们认为,无论您使用 java 编译器/jdk 8 还是 11,都没有关系,它在这两种情况下都适用,您已经使用jdk8 或 jdk11 (您只需要考虑,默认情况下 jaxb (package javax.xml.bind.annotation) 已从 jdk11 中删除,因此您将手动将其添加为依赖项/jar)。 真正重要的是您为 Web 容器 提供的 Java 版本。

如果(例如)Tomcat 将在 jdk11 上运行,则 JAXB 将无法工作,即使您将它放在类路径中并且不管您用于构建项目的 Java 版本。 另一方面,如果您将 jdk8 作为平台为您的服务器提供(在 IntelliJ 中编辑/调试配置),那么 JAXB 将不管您用于构建项目的 Java (对于 jdk11,您将添加一个依赖项/jar,对于 jdk8,它在 rt.jar 中提供)

【讨论】:

  • “在 jdk8 上运行,JAXB 将不起作用” 然后 “如果您提供 jdk8 [...],那么 JAXB 将起作用” i> 嗯?你在自相矛盾。
  • 对不起,这是一个机械错误。我只在那个子句中用 jdk11 改变了 jdk8。
  • "[如果] 在 jdk11 上运行,JAXB 将无法工作,即使您将它放在类路径中" 这是不正确的。如果您在 JDK 11 上运行,您可以通过将适当的 jar 文件添加到 Web 应用程序 WEB-INF/lib 文件夹来运行 JAXB。
  • @XmlElement(例如)在 Tomcat 上不起作用,正如我所说,当 Tomcat 在 jdk11 上运行时,当 Tomcat 在 jdk8 上运行时工作。
  • “不工作”是什么意思?如果您添加 所有 必要的 JAXB jar,它将起作用。
猜你喜欢
  • 2016-05-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
相关资源
最近更新 更多