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
_アノテーションの移動先などを見つけるのに問題があります。
@Ref
_は存在しないか、少なくとも ドキュメントにはもう記載されていません のようです。ここで、UriBuilder
を使用します。HTTPBasicAuthFilter
はHttpBasicAuthFilter
に名前が変更されました。大文字に注意してください。Client client = Client.create();
はClient client = ClientBuilder.newClient();
になりましたこの:
_ 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);
_
あなたはしません。
Jersey 2.0には、Jersey 1.0の多くの機能がありません。コミッターがあなたに言うこととは反対に、現時点では実装できないものもあります(たとえば、Guice、Spring統合)。表面的には機能しているように見えますが、深く掘り下げると、多くの機能がまだ壊れていることがわかります。
1.xプラグインの多くは2.xには存在しませんが、これは主に前述の破損が原因です。
これを踏まえて、当面はJersey 2.xを差し控えることをお勧めします。うまくいけば、コミッターは来年中にこれを片付けるでしょう。
首の痛みです。私たちは現在、3年以上前の比較的大規模なクライアント/サーバープロジェクトの移行に少し時間を費やしています。うまくいけば、私たちは闘争の終わりにいます...移行ガイドがありますが、確かにそれは決して包括的ではありません。
代わりに、WebApplication例外および後続操作に置き換えられます。移行ガイドにはそのことについての言葉はなく、これは非常に重要です。
移行ガイドは言う:
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
Jerseyのドキュメントの 1.xから2.0への移行ガイド を参照してください。 (2019へのリンク 1.xから2.0への移行ガイド )
@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);
}
}
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をクリックすると、分離された共有ライブラリの作成が完了します。
管理コンソールで次のように、この分離された共有ライブラリをアプリケーションのwarファイルにバインドします
a)アプリケーション->すべてのアプリケーション->アプリケーション名をクリックしますb)参照->共有ライブラリ参照->参照共有ライブラリ->アプリケーションwar(not ear)を選択し、[OK]をクリックします。 c)左側の[利用可能]コンボボックスで手順2で作成したライブラリを選択し、[選択済み]コンボボックスの右側に配置して[OK]をクリックします。これにより、分離された共有ライブラリをアプリケーションのwarファイルに関連付けました。