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

Rob*_*rto 25 java jax-rs jersey jboss6.x

我试图在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>
Run Code Online (Sandbox Code Playgroud)

这是我的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>
Run Code Online (Sandbox Code Playgroud)

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

     }
}
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*amL 47

NoSuchMethodError通常意味着您在类路径上有两个不同版本的类.由于javax.ws.rs.core.Application该类getProperties()在其JAX-RS 2版本中具有该方法,但在JAX-RS 1.x中没有,我猜不知道你将旧的1.x Jersey(或旧的REST api)与当前(2.3)相结合(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(如果你的项目描述符有一些父级),并仔细检查你的类路径上的内容 - 我相信javax.ws.rs-api某处有一个1.x版本.还尝试清理所有已编译的东西并从头开始重建.

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

希望这可以帮助.


gih*_*han 18

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

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

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

<dependency>
    <groupId>org.jhades</groupId>
    <artifactId>jhades</artifactId>
    <version>1.0.4</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

显示报告

调用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!
Run Code Online (Sandbox Code Playgroud)

删除pom中重叠maven依赖项之一.

您也可以使用另一种方法,如maven的依赖项排除.

来源:关于jhades的博客文章

希望这会帮助别人:)

  • 只是为了构建它,它运行的下一步运行依赖树.使用 .mvn依赖:tree> deps.txt.然后在文本文件中搜索由Jhades标记的jar. (2认同)

小智 14

刚刚开始研究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的加载:

<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>
Run Code Online (Sandbox Code Playgroud)

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