Java RestFull WebService:使用Jersey 2.3.1库的JAX-RS实现

我试图在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()exception:java.lang.NoSuchMethodError:javax.ws.rs.core.Application.getProperties()Ljava / util / Map;

在POM我把这些依赖:

 org.glassfish.jersey.core jersey-server 2.3.1   org.glassfish.jersey.containers jersey-container-servlet-core 2.3.1   javax.ws.rs javax.ws.rs-api 2.0  

这是我的web.xml,其中restEasy标签禁用:

    com.sun.jersey.samples.helloworld.resources.MyApplication org.glassfish.jersey.servlet.ServletContainer  javax.ws.rs.Application com.sun.jersey.samples.helloworld.resources.MyApplication  1   resteasy.scan false   resteasy.scan.providers false   resteasy.scan.resources false   com.sun.jersey.samples.helloworld.resources.MyApplication /*   

我的资源配置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); } } 

有人有任何想法解决它吗? 罗伯托,提前谢谢

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

你正在使用的软件包( com.sun.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的一部分。

希望这可以帮助。

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

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

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

  org.jhades jhades 1.0.4  

显示报告

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

样本输出:

 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的依赖项排除 。

来源: 关于jhades的博客文章

希望这会帮助别人:)

刚刚开始研究JBoss EAP 6.1.1 – Jersey 2.3.1。

通常的事情似乎不起作用/自己是不够的:

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

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

           

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

这是泽西岛版本的冲突问题。 我有同样的问题。 以下是解决方法:

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

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

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