为什么这个 jersey-ejb 示例失败了?

Why did this jersey-ejb example fail?

在 Jersey 项目中构建和部署 ejb 示例 here 在 Netbeans 8.2 中使用 JDK 8 和 OSX 上的 Glassfish 4.1,该项目构建了一个 war 并部署正常,但随后在 Glassfish 日志中出现以下问题:

"...org.glassfish.jersey.examples.jersey_ejb.entities.Message registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER".. (and with errors on screen about javax.ejb.EJBException)

我发现了一个类似的 SO 问题: 解决方案是将 jersy-common 添加到类路径中。

我将其添加到 /Users/myusername/GlassFish_Server/glassfish/lib 文件夹中。

应用程序现在可以正常运行。

我想知道为什么会失败,是否是示例中的错误,以及是否有比这个手动 jar 副本更好的解决方案。

在 glassfish 日志的早期,它谈到了 bundle provisioner 错误:

WARNING: Skipping entry because it is not an absolute URI.

后来的问题类使用问题org.glassfish.jersey.examples.jersey_ejb.entities.Message是唯一使用Portable JNDI名称的:

Info: visiting unvisited references Info: Portable JNDI names for EJB MessageListWriter: [java:global/jersey-examples-ejb/MessageListWriter, java:global/jersey-examples-ejb/MessageListWriter!javax.ws.rs.ext.MessageBodyWriter]

谁能提供更好的解决方案,或者修复比 jar 副本更好的项目(我应该 'have' 这样做)? (Link 到完整的 glassfish 输出 https://gist.github.com/systemsincode/26afac851a72387047f62fe1803e089b

TLDR:Glasfish 的版本太旧。

我今天使用的是最新 Jersey 的代码,它是 2.28

根据 this 博客 运行ning unzip -p modules/jersey-common.jar META-INF/MANIFEST.MF | grep Bundle-Version 在你的 glassfish 目录中应该给你你的 运行-time 版本。

在 Glassfish 4.1 中,我得到 Bundle-Version: 2.10.4

在 Glassfish 5 中,我得到 Bundle-Version: 2.26.0

我可能通过将公共库包含在 lib 目录中覆盖提供的版本来绕过一个重大更改。但是,如果您真的必须更新 glassfish 4.1,请按照上述博客中更完整的说明进行操作。