【问题标题】:java.lang.NoSuchMethodError: javax.ws.rs.core.MultivaluedMap.addAll(Ljava/lang/Object;[Ljava/lang/Object;)Vjava.lang.NoSuchMethodError: javax.ws.rs.core.MultivaluedMap.addAll(Ljava/lang/Object;[Ljava/lang/Object;)V
【发布时间】:2017-05-19 11:57:21
【问题描述】:

在我的项目中,我正在使用 jersy 客户端调用其余服务。它在本地的工作文件。但在服务器中不工作。

在本地我使用jdk1.7.0_10 在服务器中我使用jdk1.7.0_80

本地运行时:Tomcat 服务器运行时:JBOSS

Libraries:
jersey-bean-validation-2.22.jar
jersey-client-2.22.jar
jersey-common-2.22.jar
jersey-entity-filtering-2.22.jar
jersey-guava-2.7.jar
jersey-media-moxy-2.22.jar
javax.annotation-api-1.2.jar
javax.inject-1.jar
javax.ws.rs-api-2.0.1.jar
jaxrpc.jar

为什么它不能在服务器中工作?

任何帮助将不胜感激!!!!

【问题讨论】:

  • 应用服务器从本地到服务器有什么区别?
  • 您的应用程序可能嵌入了您的服务器也有的 JAX-RS 依赖项,但版本不同。然后,当服务器启动时,它会优先选择自己的依赖项而不是应用程序提供的依赖项。
  • 只有jdk版本没有其他区别都是windows只有@Roberto
  • @LucianovanderVeekens,有没有办法告诉服务器使用 jar 而不是它自己的依赖项。
  • @Madhesh 是的,但是配置当然取决于服务器。但更好的策略是只使用应用程序服务器提供的依赖项,因为它已经存在并更改代码以适应该版本的库。

标签: java web-services rest jar


【解决方案1】:

因为你在评论中说

但更好的策略是只使用应用程序服务器提供的依赖项,因为它已经存在并更改代码以适应该版本的库

您只需要使用两个接口定义所继承的方法。 (j2ee6 和 j2ee7)

根据官方门卡文档 j2ee6j2ee7 在接口定义中有方法add(K key, V value)。因此,您应该使用方法 Add 代替 addAll 来添加每个条目

希望有帮助

【讨论】:

  • 如果您确定将部署在支持它的应用程序服务器上并且不会出现版本冲突,那么使用更新版本的 API 并没有错。当使用 Maven 并且没有为服务器已经提供的依赖项设置适当的范围 (provided) 时,很容易发生这种情况。
  • 我同意,但是您还需要小心应用程序类加载器,它没有先设置在父级上,并且根据 AS,您可能会遇到与背书库的兼容性问题。
【解决方案2】:

java.lang.NoSuchMethodError 在调用不存在的方法时抛出。这通常发生在使用某些版本的接口开发应用程序代码时,而将其部署在具有较旧版本接口且没有较新版本的某些方法的环境中。

MultivaluedMap 类是 Java EE API 的一部分(更具体地说是它的 JAX-RS API 部分)。在此处查看文档:https://docs.oracle.com/javaee/7/api/javax/ws/rs/core/MultivaluedMap.html

注意它是如何声明该类自 1.0 版以来可用的,这意味着它自 JAX-RS 1.0 版以来就已存在。

另一方面,addAll 方法声明为 has only been available since version 2.0

这意味着您的开发是针对 API 的 2.0 版完成的,但您正在使用 1.0 实现的服务器上进行部署。可能的原因是:

  • 您的本地环境具有比服务器环境更新的应用程序服务器(可能是 GlassFish?)版本。
  • 本地环境已将库添加到应用程序服务器,而这些库不在服务器环境中。
  • 两种环境的有效类路径还有其他一些不同,例如在本地测试时部署的一些依赖项,但在最终构建中没有部署,环境变量的差异等。

检查本地和服务器上使用哪个应用程序服务器(GlassFish、Websphere、JBoss...),在任一环境中使用哪个版本,它们捆绑了哪个 JAX-RS API(和实现),以及捆绑到什么您的部署存档(可能是 EAR 文件)。

【讨论】: