【问题标题】:Java RestFull WebService: JAX-RS implementation with Jersey 2.3.1 librariesJava RestFul Web 服务:使用 Jersey 2.3.1 库的 JAX-RS 实现
【发布时间】:2013-10-07 13:01:05
【问题描述】:

我正在尝试在 JBoss jboss-eap-6.1 AS 上运行一个简单的“Hallo World”应用程序 Jersey 2.3.1 REST 服务。在 web.xml 我禁用了 restEasy 库。在部署期间我收到错误:

JBWEB000289:Servlet com.sun.jersey.samples.helloworld.resources.MyApplication 抛出 load() 异常:java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;

在 POM 中我放置了这些依赖项:

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0</version>
</dependency>

这是我的 web.xml 禁用了 restEasy 标签:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>com.sun.jersey.samples.helloworld.resources.MyApplication</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.sun.jersey.samples.helloworld.resources.MyApplication</param-value>
        </init-param>
           <load-on-startup>1</load-on-startup>
    </servlet>
    <context-param>
        <param-name>resteasy.scan</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>resteasy.scan.providers</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>resteasy.scan.resources</param-name>
        <param-value>false</param-value>
    </context-param>
    <servlet-mapping>
        <servlet-name>com.sun.jersey.samples.helloworld.resources.MyApplication</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

还有我的资源配置 java 类:

package com.sun.jersey.samples.helloworld.resources;
import org.glassfish.jersey.server.ResourceConfig;
public class MyApplication extends  ResourceConfig {   

     public MyApplication() {
            packages("com.sun.jersey.samples.helloworld.resources");
          //super(HelloWorldResource.class);

     }
}

有人有解决办法吗? 提前致谢, 罗伯托

【问题讨论】:

  • 您可能不想使用com.sun.jersey.samples.helloworld.resources 作为您自己文件的包...com.sun 可能不是您的...只是猜测。

标签: java jersey jax-rs jboss6.x


【解决方案1】:

NoSuchMethodError 通常意味着您的类路径中有两个不同版本的类。由于 javax.ws.rs.core.Application 类在其 JAX-RS 2 版本中确实有 getProperties() 方法,但在 JAX-RS 1.x 中没有,我猜想你正在以某种方式组合旧的 1.x Jersey(或旧的 REST api ) 与当前 (2.3.1) 之一。

此外,您正在使用的包(com.sun.jersey - '旧' Jersey 包)指向这个方向(尽管只是将代码放入该包本身不会导致上述问题),您显然是从Jersey 1.x 示例作为基础(Jersey 2 中也有示例,请参阅 Jersey GitHub 上的helloworld-webapp)。

是否有可能,restEasy(也肯定包含javax.ws.rs.core.Application 类)没有完全关闭,并且以某种方式默认为 JAX-RS 1.x 版本?

我将从检查您的 pom 文件开始,查看有效的 pom(如果您的项目描述符有一些父项)并仔细检查您的类路径中的内容 - 我相信某处有一个 1.x 版本的 javax.ws.rs-api。也尝试清理所有编译的东西并从头开始重建。

说到依赖,如果你的列表很详尽(关于 Jersey),你很可能必须添加 jersey-common (2.3.1) 依赖,因为在初始化期间,ResourceConfig.packages() 方法调用了PackageScanner构造函数,其中包含对 ReflectionHelper 的调用 - 这不再是服务器 jar 的一部分。

希望这会有所帮助。

【讨论】:

  • 嗨,感谢您的关注,我尝试按照您的建议添加 maven 依赖 jersey-common (2.3.1),我还尝试禁用 RESTeasy 删除行: 在任一配置文件中: /standalone/configuration/standalone.xml 和 /domain/configuration /domain.xml 但没有任何内容...可能正如您所建议的那样,jboss 不要关闭 RESTeasy...
  • 对于那些在使用com.sun.jersey 时遇到问题的人,请查看org.glassfish.jersey 以获取 Jersey 2.x 软件包。
  • 如果使用gradle,你可以进入这个部分:configurations.all { resolutionStrategy.dependencySubstitution { //这解决了同一组类实现(不同版本)JSR的不同gradle包名的问题-311。用 module('javax.ws.rs:javax.ws.rs-api:2.0.1') } } 替换 module('javax.ws.rs:jsr311-api')
【解决方案2】:

我最近遇到了同样的问题。我想为你分享我的步骤。正如其他答案所述,问题主要是因为您的类路径中有两个不同版本的同一类。因此,当您在 pom 中添加 maven 依赖项时要小心。

这类问题通常称为Jar Hell。您可以使用 jhades API 来调查类之间的重叠。这是我遵循的简单步骤。

将 jhades 依赖项添加到您的 pom 中。

<dependency>
    <groupId>org.jhades</groupId>
    <artifactId>jhades</artifactId>
    <version>1.0.4</version>
</dependency>

显示报告

在您的main 方法中调用new JHades().overlappingJarsReport();,它将输出到标准输出。

样本输出:

file:/Users/justin/.m2/repository/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar overlaps with
file:/Users/justin/.m2/repository/javax/ws/rs/javax.ws.rs-api/2.0/javax.ws.rs-api-2.0.jar - total overlapping classes: 55 - same classloader ! This is an ERROR!

删除 pom 中的一个重叠 maven 依赖项。

您也可以使用其他方法,例如 maven 的 dependency exclusions

来源:Blog post on jhades

希望这会对某人有所帮助:)

【讨论】:

  • 只是在此基础上构建,下一步它运行一个依赖树。利用 。 mvn 依赖:树 > deps.txt。然后在文本文件中搜索 Jhades 标记的 jar。
  • 确实是地狱。感谢您的建议!杰德斯
  • 您好,我也有同样的问题。我正在使用 Jersey2.22.2,我的类路径中没有任何其他 jar 文件,除了 Jersey。我遇到了同样的错误。我跑了 Jhades 的报告并没有说任何关于泽西多个班级的事情。我正在使用 apache-tomee-plus-1.7.4 服务器。有什么建议吗?
  • @Philip PJ 通常会发生这种情况,因为当依赖关系相互重叠时。在你的情况下也会有。如果这种方法对你没有帮助。你必须找到另一种方法。我对不起,我对 apache tomee 不太熟悉。也许这会对你有所帮助。 stackoverflow.com/questions/13780860/…。如果您解决了您的问题,请在此处发布您的答案,这将对某些人有所帮助。
【解决方案3】:

刚刚在 JBoss EAP 6.1.1 - Jersey 2.3.1 上工作。

通常的事情本身似乎不起作用/不够:

  • 在standalone.xml/domain.xml 中禁用jaxrs-subsystem
  • 或者,不包括 jboss-deployment-structure.xml 中的 jax-rs 模块

另外,您需要通过修改 module.xml 来完全禁用 jax-rs 1.1 API 的加载 jboss-eap-6.1/modules/system/layers/base/javax/ws/rs/api/main/module.xml 像这样:

<module xmlns="urn:jboss:module:1.1" name="javax.ws.rs.api">
<resources>
    <!-- Disable the next line -->
    <!-- resource-root path="jboss-jaxrs-api_1.1_spec-1.0.1.Final-redhat-2.jar"/ -->
    <!-- Insert resources here -->
</resources>

<dependencies>
    <module name="org.jboss.resteasy.resteasy-jaxrs" services="export"/>
</dependencies>
</module>

请注意,这也会为所有其他应用程序禁用 JBoss (RestEasy) 的 jax-rs 实现(与在standalone/domain.xml 中禁用 jaxrs 子系统一样)。

【讨论】:

  • 这解决了我的问题。就我而言,路径与 module.xml 略有不同。就像,jboss-as-7.1.1.Final\modules\javax\ws\rs\api\main\module.xml
  • 这个解决方案还解决了我在尝试调用外部休息服务时的问题,因此客户端在 JBoss EAP 6.4 上运行(并且打包在 EAR 文件中 - 没有 Web 应用程序)
  • 不修改module.xml有什么办法吗?
【解决方案4】:

这是一个 Jersey 版本冲突问题。我有同样的问题。解决方法如下:

  1. 查看你的包依赖“mvn dependency:tree”

  2. 如果有依赖于旧 Jersey 版本的库依赖项,您可以在 pom.xml 中的该库的依赖项标记中添加排除部分

【讨论】:

    【解决方案5】:

    使用 mvn dependency:tree(感谢上面的建议)我能够确定罪魁祸首(在我的情况下)是:javax.ws.rs:jsr311-api:1.1 删除这个依赖解决了我的问题。

    【讨论】:

      猜你喜欢
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      相关资源
      最近更新 更多