Java RestFull WebService:带有 Jersey 2.3.1 库的 JAX-RS 实现

2022-09-01 16:23:16

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

JBWEB000289: Servlet com.sun.jersey.samples.helloworld.resources.MyApplication threw load() exception: 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>

这是我的网络.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);

     }
}

有人有什么想法来解决它吗?提前致谢, 罗伯托


答案 1

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

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

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

我会从检查你的pom文件开始,查看有效的pom(如果你的项目描述符有一些父级),并仔细检查你的类路径上有什么 - 我相信有一个1.x版本的某个地方。还要尝试清理所有已编译的内容并从头开始重建。javax.ws.rs-api

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

希望这有帮助。


答案 2

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

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

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

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

显示报告

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

示例输出:

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的博客文章

希望这将有助于某人:)


推荐