web-dev-qa-db-ja.com

Java RestFul Web Service:Jersey 2.3.1ライブラリを使用したJAX-RS実装

シンプルな「Hallo World」アプリケーションJersey 2.3.1 REST JBoss jboss-eap-6.1 ASのサービスを実行しようとしています。web.xmlでrestEasyライブラリを無効にしました。エラーを取得する:

JBWEB000289:サーブレット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>

これはrestEasyタグが無効になっている私のweb.xmlです:

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

     }
}

誰かがそれを解決するアイデアを持っていますか?事前に感謝、ロベルト

25
Roberto

NoSuchMethodErrorは通常、クラスパスに2つの異なるバージョンのクラスがあることを意味します。 _javax.ws.rs.core.Application_クラスにはJAX-RS 2バージョンではgetProperties()メソッドがありますが、JAX-RS 1.xではそうではないので、古い1.xを何らかの形で組み合わせていると思います。ジャージー(または古いREST api)と現在の(2.3.1)のもの。

また、作業中のパッケージ(_com.Sun.jersey_-「古い」ジャージーパッケージ)は、この方向に少し向いています(ただし、そのパッケージ自体にコードを配置するだけでは、前述の問題を引き起こすことはできません)。ベースとしての1.xの例(Jersey 2にもサンプルがあります。JerseyGitHubの helloworld-webapp を参照してください)。

RestEasy(_javax.ws.rs.core.Application_クラスも確実に含む)が完全にオフにされておらず、何らかの理由でJAX-RS 1.xバージョンにデフォルト設定されている可能性はありますか?

私はあなたのPOMファイルを調べて、有効なPOMを見て(プロジェクト記述子に親がある場合)、クラスパスにあるものを注意深く確認します-_javax.ws.rs-api_の1.xバージョンがどこかにあると思います。また、すべてのコンパイルされたものをきれいにして、ゼロから再構築してみてください。

依存関係について言えば、リストが網羅的である場合(ジャージーに関して)、おそらく初期化中にResourceConfig.packages()メソッドが呼び出す_jersey-common_(2.3.1)依存関係を追加する必要があります。 PackageScannerへの呼び出しを含むReflectionHelperコンストラクター-これはサーバーjarの一部ではなくなりました。

お役に立てれば。

47
AdamL

私は最近同じ問題に直面しました。私はあなたのために私のステップを共有すると思った。他の答えが示すように、問題は主にクラスパスに同じクラスの2つの異なるバージョンがあるためです。そのため、pomにMaven依存関係を追加するときは注意してください。

この種の問題は、通常Jar Hellと呼ばれます。 jhadesAPIを使用して、クラスが互いに重複していることを調査できます。ここに私が従った簡単な手順があります。

pomにjhades依存関係を追加します

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

レポートを表示する

mainメソッドでnew JHades().overlappingJarsReport();を呼び出すと、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依存関係の1つを削除します。

また、mavenの dependency excludes のような別のアプローチを使用することもできます。

ソース: jhadesのブログ投稿

これが誰かを助けることを願っています:)

18
gihan

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>

これにより、他のすべてのアプリケーションのJBoss(RestEasy)のjax-rs実装も無効になります(standalone/domain.xmlのjaxrsサブシステムを無効にする)。

13
Jan Snelders

これは、ジャージーバージョンの競合の問題です。同じ問題がありました。解決方法は次のとおりです。

  1. パッケージの依存関係「mvndependency:tree」を参照してください

  2. 古いJerseyバージョンに依存するライブラリ依存関係がある場合、pom.xmlのそのライブラリの依存関係タグに除外セクションを追加できます。

4
Hajar Homayouni

Mvndependency:tree(上記の提案に感謝)を使用して、犯人(私の場合)がjavax.ws.rs:jsr311-api:1.1であることがわかりました。この依存関係を削除することで問題が解決しました。

1
David Loy