Подтвердить что ты не робот

Java RestFull WebService: реализация JAX-RS с использованием библиотек Jersey 2.3.1

Я пытаюсь запустить простое приложение "Hallo World". Джерси 2.3.1 Служба REST на JBoss jboss-eap-6.1 AS. В web.xml у меня отключена библиотека restEasy. Во время развертывания я получаю сообщение об ошибке:

JBWEB000289: Сервлет com.sun.jersey.samples.helloworld.resources.MyApplication throw load() Исключение: java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties() Ljava/Util/Карта;

В 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>

И мой ресурс config java class:

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);

     }
}

У кого-то есть идея решить его? заранее спасибо, Роберто

4b9b3361

Ответ 1

NoSuchMethodError обычно означает, что у вас есть две разные версии класса в вашем пути к классам. Поскольку класс javax.ws.rs.core.Application имеет метод getProperties() в своей версии JAX-RS 2, но не в JAX-RS 1.x, я бы предположил, что каким-то образом вы комбинируете старый Джерси 1.x(или старый REST api ) с токовым (2.3.1).

Также пакет, в котором вы работаете (com.sun.jersey - "старый" пакет Джерси) немного указывает на это направление (хотя просто размещение вашего кода в этом пакете не может вызвать указанную проблему), вы, очевидно, начали с Пример Джерси 1.x в качестве базы (также есть образцы в Джерси 2, см. helloworld-webapp на Jersey GitHub).

Возможно ли, что restEasy (также определенно содержащий класс javax.ws.rs.core.Application) не полностью отключен и каким-то образом по умолчанию используется версия JAX-RS 1.x?

Я бы начал с проверки вашего файла pom, посмотрите на эффективную pom (если у вашего дескриптора проекта есть какой-то родительский элемент) и тщательно проверьте, что находится в вашем пути к классам - я считаю, что где-то есть версия 1.x javax.ws.rs-api. Также попробуйте очистить все скомпилированные материалы и перестроить с нуля.

Говоря об зависимостях, если ваш список является исчерпывающим (в отношении Джерси), вам, скорее всего, придется добавить зависимость jersey-common (2.3.1), как уже во время инициализации, метод ResourceConfig.packages() вызывает PackageScanner конструктор, который содержит вызов ReflectionHelper - и это уже не является частью сервера.

Надеюсь, что это поможет.

Ответ 2

Я столкнулся с такой же проблемой в последнее время. Я думал поделиться с вами своими шагами. Как утверждают другие ответы, проблема заключается в основном из-за наличия двух разных версий одного и того же класса в вашем пути к классам. Поэтому, когда вы добавляете зависимости maven в своем pom, будьте осторожны.

Эти проблемы обычно называются Jar Hell. Вы можете использовать API jhades для исследования классов, перекрывающих друг друга. Вот простые шаги, которые я выполнил.

Добавьте зависимость jhades в ваш pom.

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

Показать отчет

Вызвать 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!

Удалите одну из наложенных зависимостей maven в вашей папке.

Также вы можете использовать другой подход, например maven исключения зависимостей.

Источник: Сообщение в блоге по jhades

Надеюсь, это поможет кому-то:)

Ответ 3

Просто это работало над JBoss EAP 6.1.1 - Jersey 2.3.1.

Обычные вещи, похоже, не работают/не хватает сами по себе:

  • отключение jaxrs-подсистемы в файле standalone.xml/domain.xml
  • или, исключая модули jax-rs в jboss-deployment-structure.xml

Дополнительно вы должны полностью отключить загрузку jax-rs 1.1 API, изменив module.xml в 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>

Обратите внимание, что это приведет к отключению Jax-rs-реализации JBoss (RestEasy) для всех других приложений (как отключает подсистему jaxrs в автономном/domain.xml).

Ответ 4

Это проблема конфликта с версией в Джерси. У меня такая же проблема. Вот как это разрешено:

  • Смотрите зависимости вашего пакета "mvn dependency: tree"

  • Если зависимость библиотеки зависит от версии старого Джерси, вы можете добавить раздел исключения в теге зависимостей для этой библиотеки в pom.xml

Ответ 5

Использование mvn dependency: tree (спасибо за предложение выше) Я смог определить, что виновником (в моем случае) был: javax.ws.rs:jsr311-api:1.1 Удаление этой зависимости решило мою проблему.