web-dev-qa-db-ja.com

Jersey 1.0からJersey 2.0に移行するにはどうすればよいですか?

Jersey 2.0にアップグレードしようとしていますが、JerseyのgroupIdsとArtifactIdsが完全に変更されており、移行計画が Jersey docs で見つからないため、多くの問題が発生しています。

これは私のpom.xmlが以前はどのようになっていたかで、これは問題なくコンパイルされました:

_        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.17</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-servlet</artifactId>
            <version>1.17</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-server-linking</artifactId>
            <version>1.17.1</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
            <version>1.17.1</version>
        </dependency>
_

これらは何に変更する必要がありますか? この無関係のStackOverflowの質問はやや役に立ちました しかし、_@Ref_アノテーションの移動先などを見つけるのに問題があります。


更新

  1. _@Ref_は存在しないか、少なくとも ドキュメントにはもう記載されていません のようです。ここで、UriBuilderを使用します。
  2. 私は私のmavenの問題に答えるドキュメントで非常に役立つセクションを見つけました
  3. HTTPBasicAuthFilterHttpBasicAuthFilterに名前が変更されました。大文字に注意してください。
  4. Client client = Client.create();Client client = ClientBuilder.newClient();になりました
  5. この:

    _    String json = client
            .resource(getBaseUrl() + url)
            .accept(MediaType.APPLICATION_JSON_TYPE)
            .get(String.class);
    _

    になった

    _String json = client
            .target(getBaseUrl())
            .path(url)
            .request(MediaType.APPLICATION_JSON_TYPE)
            .get(String.class);
    _
22
Daniel Kaplan

あなたはしません。

Jersey 2.0には、Jersey 1.0の多くの機能がありません。コミッターがあなたに言うこととは反対に、現時点では実装できないものもあります(たとえば、Guice、Spring統合)。表面的には機能しているように見えますが、深く掘り下げると、多くの機能がまだ壊れていることがわかります。

1.xプラグインの多くは2.xには存在しませんが、これは主に前述の破損が原因です。

これを踏まえて、当面はJersey 2.xを差し控えることをお勧めします。うまくいけば、コミッターは来年中にこれを片付けるでしょう。

12
Gili

首の痛みです。私たちは現在、3年以上前の比較的大規模なクライアント/サーバープロジェクトの移行に少し時間を費やしています。うまくいけば、私たちは闘争の終わりにいます...移行ガイドがありますが、確かにそれは決して包括的ではありません。

  • UniformInterfaceException(およびその他)はなくなりました。

代わりに、WebApplication例外および後続操作に置き換えられます。移行ガイドにはそのことについての言葉はなく、これは非常に重要です。

  • JSONサポート

移行ガイドは言う:

JSONサポートは、Jersey 2.xで特定の変更が行われました。開発者にとって最も目に見える違いは、初期化と構成です。

Jersey 1.xでは、JAXB/JSONサポートはjersey-jsonモジュールのMessageBodyReadersおよびMessageWritersのセットとして実装されていました。内部的には、Jersey独自のカスタムソリューションから、JacksonやJettisonなどのサードパーティプロバイダーまで、JSONからオブジェクトへのマッピングの実装がいくつかありました。 JSONサポートの構成は、JSONConfigurationおよびJSONJAXBContextクラスに集中化されました。

すごい。 「ジャージー独自のカスタムソリューション」を選択した場合はどうでしょう(何らかの理由で行いました)。 jersey 2にはこれに代わるものはありません。Jettison、Jackson、Moxyプロバイダーを使用して同じJSON形式を作成しようとしました。私は成功しませんでした。参考までに、ここで私の未回答の質問: Jersey 2 JSON Jettison unwrapping root element

8
Svilen

Jerseyのドキュメントの 1.xから2.0への移行ガイド を参照してください。 (2019へのリンク 1.xから2.0への移行ガイド

7
Justin Emery

@InjectLink@Refに代わるものです。

そのリンクから、これを私のpom.xmlにドロップすることができました。

    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-declarative-linking</artifactId>
        <version>2.6</version>
    </dependency>

次に、既存の@Refを使用して、@InjectLinkに置き換えることができました。

public Long id; // This id is referenced below in the link

@InjectLink(resource = FavoriteResource.class, method = "updateFavorites", bindings = {
        @Binding(name = "listId", value = "${instance.id}")
})
public URI linkURI;

@Refの一部のJavaDocsが@InjectLinkに含まれているようです。これは、これが置き換えであることをさらに確認するものです。

/**
 * ...
 * @Ref(resource=SomeResource.class)
 * @Ref(resource=SomeResource.class, bindings={
 *   @Binding(name="id" value="${instance.id}"}
 * )
*/

編集:

トリッキーなもの。これを機能させるには、もう1つ必要でした。 web.xmlでは、次のようになっています。

<servlet>
    <servlet-name>jersey-servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.mycompany.root</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>com.mycompany.root.web.filter.AuditResourceFilterFactory;com.mycompany.root.web.filter.OtherAuditResourceFilterFactory</param-value>
    </init-param>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.mycompany.root.web.resource.config.CustomResourceConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

そして最後に、CustomResourceConfig.Javaは次のようになります

import org.glassfish.jersey.linking.DeclarativeLinkingFeature;
import org.glassfish.jersey.server.ResourceConfig;

public class CustomResourceConfig extends ResourceConfig {
    public CustomResourceConfig() {
        packages("org.glassfish.jersey.examples.linking");
        register(DeclarativeLinkingFeature.class);
    }
}
3
Patrick

Jersey 1からJersey 2に移行するには、次の手順に従います。

POMファイルに次の依存関係を追加します:Jersey 2.23.2依存関係

   <dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>2.23.2</version>
   </dependency>
   <dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-spring3</artifactId>
    <version>2.23.2</version>
    <exclusions>
     <exclusion>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
     </exclusion>
     <exclusion>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
     </exclusion>
     <exclusion>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
     </exclusion>
    </exclusions>
   </dependency>
   <dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.23.2</version>
   </dependency>
   <dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.23.2</version>
   </dependency>
   <dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-entity-filtering</artifactId>
    <version>2.23.2</version>
   </dependency>
   <dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.23.2</version>
   </dependency>
   <dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-common</artifactId>
    <version>2.23.2</version>
   </dependency>
   <dependency>
    <groupId>org.glassfish.jersey.bundles.repackaged</groupId>
    <artifactId>jersey-guava</artifactId>
    <version>2.23.2</version>
   </dependency>
   <dependency>
      <groupId>org.glassfish.jersey.media</groupId>
      <artifactId>jersey-media-json-jackson</artifactId>
      <version>2.23.2</version>
      <exclusions>
       <exclusion>
        <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-annotations</artifactId>
       </exclusion>
      </exclusions>
   </dependency>
   <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.5.4</version>
   </dependency>
   <dependency>
       <groupId>org.glassfish.jersey.media</groupId>
       <artifactId>jersey-media-multipart</artifactId>
       <version>2.23.2</version>
   </dependency>

   <dependency>
       <groupId>org.jvnet</groupId>
       <artifactId>mimepull</artifactId>
       <version>1.6</version>
   </dependency>

Web.xmlに以下のエントリを作成します。

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" 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_3_0.xsd">

 <servlet>
  <servlet-name>jersey-servlet</servlet-name>
  <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  <init-param>
   <param-name>javax.ws.rs.Application</param-name>
   <param-value>com.jsg.resource.initializer.RestResourceInitializer</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>jersey-servlet</servlet-name>
  <url-pattern>/rest/*</url-pattern>
 </servlet-mapping> '

       <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml</param-value>
 </context-param>
      <resource-ref>
        <description>DB Connection</description>
        <res-ref-name>jdbc/myAppName</res-ref-name>
       <res-type>javax.sql.DataSource</res-type>
       <res-auth>Container</res-auth>
   </resource-ref>
</web-app>

RestResourceIntializerに次のコードを記述します

    package com.jsg.resource.initializer;

    import Java.util.HashSet;
    import Java.util.Set;
    import javax.ws.rs.core.Application;

    public class RestResourceInitializer extends Application {

     /**
      * Gets the classes.
      *
      * @return the classes
      */
     public Set<Class<?>> getClasses() {
      Set<Class<?>> classes = new HashSet<Class<?>>(); 

      // Resources
      classes.add(org.glassfish.jersey.jackson.JacksonFeature.class);
      classes.add(org.glassfish.jersey.server.spring.scope.RequestContextFilter.class);
      classes.add(org.glassfish.jersey.media.multipart.MultiPartFeature.class);

                   //Rest classes within Application.
                    classes.add(com.jsg.rest.AbcRestService.class);

      classes.add(com.jsg.rest.CdeRestService.class);
      return classes;
     }
    }

上記の変更を加えたコードをwebsphereにデプロイすると、次の例外が発生します。

Caused by: Java.lang.NoSuchMethodError: javax/ws/rs/core/Application.getProperties()Ljava/util/Map; at org.glassfish.jersey.server.ApplicationHandler.(ApplicationHandler.Java:287) at org.glassfish.jersey.servlet.WebComponent.(WebComponent.Java:311)

上記の例外の理由は、WebsphereがJAX-RS 1実装をサポートしていることですが、Jax-rs 2実装であるJersey 2コードをデプロイしています。

上記の例外を解決するための手順:

したがって、基本的には、WebSphereにデフォルトのJax-rs 1ではなくJersey 2 jarを選択させる必要があります。そのためには、次の手順に従う必要があります。

1)ビルドされたJAX-RSで、以下のJVMプロパティをtrueに設定して無効にします

com.ibm.websphere.jaxrs.server.DisableIBMJAXRSEngine=true

このプロパティは、WebSphereの管理コンソールからサーバー->すべてのサーバー->->サーバーインフラストラクチャ-> Javaおよびプロセス管理->プロセス定義->追加のプロパティ-> = Java仮想マシン->追加のプロパティ->カスタムプロパティ

2)Jersey 2 jarおよびSpring 4 jarの分離された共有ライブラリを作成します。分離された共有ライブラリは、Websphereの管理コンソールから[環境]-> [共有ライブラリ]-> [新規]に移動して作成できます。

クラスパスボックスでは、サーバー上のフォルダーのパスを入力する必要があります。ここで、Jersey 2およびSpring 4のすべてのjarファイルを配置しました

/var/was/server2/jerseyLib1/spring-context-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-core-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-beans-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-aop-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-web-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-expression-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-bridge-2.5.0-b05.jar
/var/was/server2/jerseyLib1/hk2-locator-2.5.0-b05.jar
/var/was/server2/jerseyLib1/hk2-api-2.5.0-b05.jar
/var/was/server2/jerseyLib1/hk2-utils-2.5.0-b05.jar
/var/was/server2/jerseyLib/javax.inject-2.5.0-b05.jar
/var/was/server2/jerseyLib1/javax.annotation-api-1.2-b03.jar
/var/was/server2/jerseyLib1/javax.ws.rs-api-2.0.1.jar
/var/was/server2/jerseyLib1/jersey-client-2.23.2.jar
/var/was/server2/jerseyLib1/jersey-spring3-2.23.2.jar
/var/was/server2/jerseyLib1/jersey-container-servlet-core-2.23.2.jar
/var/was/server2/jerseyLib1/jersey-server-2.23.2.jar
/var/was/server2/jerseyLib1/jersey-common-2.23.2.jar

/var/was/server2/jerseyLib1/jersey-guava-2.23.2.jar

また、クラスの読み込みセクションで、「この共有ライブラリに分離されたクラスローダーを使用する」を選択します

最後に[適用]をクリックし、Okをクリックすると、分離された共有ライブラリの作成が完了します。

  1. 管理コンソールで次のように、この分離された共有ライブラリをアプリケーションのwarファイルにバインドします

    a)アプリケーション->すべてのアプリケーション->アプリケーション名をクリックしますb)参照->共有ライブラリ参照->参照共有ライブラリ->アプリケーションwar(not ear)を選択し、[OK]をクリックします。 c)左側の[利用可能]コンボボックスで手順2で作成したライブラリを選択し、[選択済み]コンボボックスの右側に配置して[OK]をクリックします。これにより、分離された共有ライブラリをアプリケーションのwarファイルに関連付けました。

  2. サーバーを再起動すると、アプリケーションが起動して実行されます。
0
learner