Как я могу перейти с Джерси 1.0 на Джерси 2.0?
Я пытаюсь перейти на Джерси 2.0, и у меня много проблем, потому что groupIds и artifactIds of Jersey полностью изменились, и я не могу найти план миграции в Дочерние документы.
Вот как выглядел мой 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>
В чем их следует изменить? qaru.site/info/67024/..., но у меня возникли проблемы с поиском таких вещей, как перемещение аннотации @Ref
.
Update
- Похоже, что
@Ref
больше не существует или, по крайней мере, он больше не упоминается в документации. Теперь вы используете UriBuilder
.
- Я нашел очень полезный раздел в документации, которая отвечает на мои проблемы с maven.
-
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);
Ответы
Ответ 1
Нет.
Джерси 2.0 не хватает многих функций от Джерси 1.0. Вопреки тому, что коммиттеры скажут вам, некоторые вещи сейчас невозможно реализовать прямо (например, интеграция Guice, Spring). Вещи, кажется, работают на поверхности, но как только вы копаете глубже, вы обнаружите, что многие функции все еще сломаны.
Многие из плагинов 1.x не существуют в 2.x, главным образом из-за вышеупомянутого поломки.
В свете этого я предлагаю провести на Jersey 2.x в обозримом будущем. Надеюсь, коммиттеры уберут это в следующем году.
Ответ 2
Это боль в шее, которую я должен сказать.
В настоящее время мы в колене погружаемся в довольно крупный проект с более чем 3-летним клиентом-сервером, и я хочу, чтобы я укусил шею.
Надеюсь, мы в конце борьбы...
Несмотря на то, что есть руководство по миграции, оно не является исчерпывающим каким-либо образом.
- UniformInterfaceException (и другие) больше не существует.
Вместо этого он заменяется исключением и преемниками WebApplication. В руководстве по миграции нет ни слова об этом, и это очень важно.
В руководстве по миграции говорится:
Поддержка JSON претерпела определенные изменения в Jersey 2.x. Большинство видимая разница для разработчика заключается в инициализации и конфигурации.
В Джерси 1.x поддержка JAXB/JSON была реализована как набор MessageBodyReaders и MessageWriters в модуле jersey-json. Внутри было несколько реализаций JSON для Object картирование от Джерси собственное заказное решение для сторонних провайдеров, таких как Джексон или Джеттисон. Конфигурация JSON поддержка была централизована в JSONConfiguration и JSONJAXBContext классы.
Великий. Что, если вы выбрали "собственное решение для" Джерси "(что мы по какой-то причине сделали)? Нет альтернативы этому в джерси 2. Я попытался создать тот же формат JSON, используя провайдеры Jettison, Jackson и Moxy. Мне не удалось. Для справки, мой оставшийся без ответа вопрос здесь: Джерси 2 JSON Jettison разворачивает корневой элемент
Ответ 3
См. руководство по миграции от 1.x до 2.0 в документах Джерси.
Ответ 4
Похоже, @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;
Похоже, что некоторые из JavaDocs из @Ref
находятся в @InjectLink
даже, что будет еще одним подтверждением того, что это замена:
/**
* ...
* @Ref(resource=SomeResource.class)
* @Ref(resource=SomeResource.class, bindings={
* @Binding(name="id" value="${instance.id}"}
* )
*/
EDIT:
Трюки. Мне понадобилась еще одна часть, чтобы сделать эту работу для меня. В 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);
}
}
Ответ 5
Вы можете выполнить следующие шаги для перехода с Jersey 1 на Jersey 2:
Добавьте следующие зависимости в файл POM:
Джерси 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, однако мы развертываем код Джерси 2, который является реализацией Jax-rs 2.
Шаги для устранения вышеуказанного исключения:
Таким образом, в основном мы должны заставить WebSphere выбрать наши Джерси 2 баночки вместо Jax-rs по умолчанию 1. Нам нужно выполнить следующие шаги для этого
1) Отключите встроенный JAX-RS, установив для свойства JVM значение true
com.ibm.websphere.jaxrs.server.DisableIBMJAXRSEngine=true
Это свойство можно установить через консоль администратора WebSphere, перейдя на серверы → All Server → - > Server Infrastructure → Java и управление процессами → Процесс Deifinition → Дополнительные свойства- > Виртуальная машина Java → Дополнительные свойства → Пользовательские свойства
2) Создайте отдельную общую библиотеку с двумя флягами Джерси и Spring 4 банками Отдельную общую библиотеку можно создать через консоль администрирования Websphere, перейдя в "Environment- > Shared Libraries → New
n поле classpath, нам нужно ввести путь к папке на сервере, где мы разместили все Jersey 2 и Spring 4 Jars
/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
Также в разделе загрузки классов выберите "использовать изолированный загрузчик классов для этой общей библиотеки"
а затем, наконец, нажмите "Применить" и "ОК" , и мы закончили создание изолированной общей библиотеки.
-
Свяжите эту изолированную общую библиотеку с вашим военным файлом приложения следующим образом в консоли администратора
a) Приложение → Все приложения → Нажмите на название своей заявки
б) Перейдите к ссылкам → Ссылки на общую библиотеку → Справочные общие библиотеки → выберите войну с приложением (не ухо) и нажмите "ОК" .
c) Выберите библиотеку, созданную на шаге 2, в поле "Доступные" на левой стороне и поместите ее в правую сторону в поле "Выбранные" и нажмите "ОК" .
При этом мы связали изолированную общую библиотеку с файлом war приложения.
- Перезагрузка сервера и приложения должны быть запущены и запущены.
Ссылка со снимками экрана → http://javasolutionsguide.blogspot.nl/2017/03/howtomigratefromjersey1tojersey2InWebsphere.html