maven - ¿Cómo emigro de Jersey 1.0 a Jersey 2.0?
glassfish-2.x jersey-1.0 (5)
Estoy intentando actualizar a Jersey 2.0 y estoy teniendo muchos problemas porque los GroupId y los artefactos de Jersey han cambiado por completo y no puedo encontrar un plan de migración en los documentos de Jersey .
Así es como se veía mi pom.xml, y esta multa compilada:
<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>
¿A qué se deben cambiar estos? Esta pregunta no relacionada de StackOverflow fue algo útil, pero estoy teniendo problemas para encontrar cosas como a dónde se trasladó la anotación @Ref
.
Actualizar
- Parece que
@Ref
ya no existe o al menos ya no se menciona en la documentación . Ahora usas unUriBuilder
. - Encontré una sección muy útil en la documentación que responde a mis problemas de Maven .
- El
HTTPBasicAuthFilter
ha sido renombrado aHttpBasicAuthFilter
. Note la capitalización. -
Client client = Client.create();
se ha convertido enClient client = ClientBuilder.newClient();
Esta:
String json = client .resource(getBaseUrl() + url) .accept(MediaType.APPLICATION_JSON_TYPE) .get(String.class);
se ha convertido
String json = client .target(getBaseUrl()) .path(url) .request(MediaType.APPLICATION_JSON_TYPE) .get(String.class);
Consulte la guía de migración de 1.x a 2.0 en los documentos de Jersey.
Es el dolor en el cuello lo que tengo que decir. Actualmente estamos trabajando profundamente en la migración de un proyecto cliente-servidor relativamente grande de más de 3 años y, por eso, quiero arrancarme el cuello. Esperemos que estemos al final de la lucha ... Si bien hay una guía de migración, de hecho, no es exhaustiva de ninguna manera.
- UniformInterfaceException (y otros) ya no existe.
En su lugar, es reemplazado por la excepción WebApplication y los sucesores. No hay una palabra sobre eso en la guía de migración y esto es muy importante.
- Soporte JSON
La guía de migración dice:
El soporte de JSON ha sufrido ciertos cambios en Jersey 2.x. La diferencia más visible para el desarrollador está en la inicialización y la configuración.
En Jersey 1.x, el soporte JAXB / JSON se implementó como un conjunto de MessageBodyReaders y MessageWriters en el módulo jersey-json. Internamente, hubo varias implementaciones de JSON para el mapeo de objetos que van desde la solución personalizada de Jersey hasta proveedores externos, como Jackson o Jettison. La configuración del soporte JSON se centralizó en las clases JSONConfiguration y JSONJAXBContext.
Genial. ¿Qué sucede si ha elegido la "solución personalizada de Jersey" (lo que hicimos por cualquier motivo)? No hay alternativa a eso en el jersey 2. Intenté producir el mismo formato JSON utilizando los proveedores de Jettison, Jackson y Moxy. No lo logré. Para referencia, mi pregunta sin respuesta aquí: Jersey 2 JSON Jettison desenvolver el elemento raíz
Parece que @InjectLink
es el reemplazo para @Ref
.
Desde ese enlace, pude soltar esto en mi pom.xml:
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-declarative-linking</artifactId>
<version>2.6</version>
</dependency>
y luego tomé un @Ref
existente y pude reemplazarlo con @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;
Parece que algunos de los JavaDocs de @Ref
están incluso en @InjectLink
, lo que sería una confirmación más de que es el reemplazo:
/**
* ...
* @Ref(resource=SomeResource.class)
* @Ref(resource=SomeResource.class, bindings={
* @Binding(name="id" value="${instance.id}"}
* )
*/
EDITAR:
Cosas difíciles Necesitaba una pieza más para hacer que esto funcionara para mí. En web.xml
, ahora tengo:
<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>
y finalmente, CustomResourceConfig.java
ve así
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);
}
}
Puede seguir los siguientes pasos para la migración de Jersey 1 a Jersey 2:
Agregue las siguientes dependencias en el archivo POM: dependencias de 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>
Haga la siguiente entrada en 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>
Escriba el siguiente código en 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;
}
}
Ahora, si implementa código con los cambios anteriores en websphere, obtendrá la siguiente excepción:
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)
El motivo de la excepción anterior es que, Websphere es compatible con la implementación de JAX-RS 1, sin embargo, estamos implementando el código Jersey 2 que es la implementación de Jax-rs 2.
Pasos para resolver la excepción anterior:
Básicamente, lo que tenemos que hacer es obligar a WebSphere a elegir nuestros tarros Jersey 2 en lugar de los Jax-rs predeterminados 1. Necesitamos seguir los siguientes pasos para eso
1) Deshabilite en JAX-RS integrado configurando la siguiente propiedad JVM en verdadero
com.ibm.websphere.jaxrs.server.DisableIBMJAXRSEngine=true
Esta propiedad se puede configurar a través de la consola de administración de WebSphere yendo a Servidores-> Todos los servidores -> -> Infraestructura del servidor -> Java y gestión de procesos -> Proceso de definición -> Propiedades adicionales -> Máquina virtual Java -> Propiedades adicionales -> Personalizado Propiedades
2) Crear una Biblioteca compartida aislada con los Tarros Jersey 2 y Spring 4 Jars La biblioteca compartida aislada se puede crear a través de la Consola de administración de Websphere yendo a Entorno-> Bibliotecas compartidas -> Nuevo
En el cuadro de classpath, debemos ingresar la ruta de la carpeta en el servidor, donde hemos colocado todos los tarros Jersey 2 y Spring 4.
/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
También en la sección de carga de clases, seleccione "usar un cargador de clases aislado para esta biblioteca compartida"
y finalmente, haga clic en Aplicar y Aceptar y hemos terminado con la creación de una biblioteca compartida aislada.
Enlace esta biblioteca compartida aislada con el archivo war de tu aplicación de la siguiente manera en la Consola de administración
a) Aplicación -> Todas las aplicaciones -> Haga clic en el nombre de su aplicación b) Vaya a Referencias -> Bibliotecas compartidas Referencias -> Bibliotecas compartidas de referencia -> seleccione su aplicación war (Not ear) y haga clic en Aceptar. c) Seleccione la biblioteca que creamos en el Paso 2 en el cuadro combinado "Disponible" en el lado izquierdo y colóquela en el lado derecho en el cuadro combinado "Seleccionado" y haga clic en Aceptar. Con esto hemos asociado la biblioteca compartida aislada con el archivo war de la aplicación.
- El servidor de reinicio y la aplicación deben estar en funcionamiento.
Referencia con capturas de pantalla -> http://javasolutionsguide.blogspot.nl/2017/03/howtomigratefromjersey1tojersey2InWebsphere.html
Usted no
Jersey 2.0 le falta mucha funcionalidad a Jersey 1.0. Contrariamente a lo que los comentaristas le dirán, algunas cosas son absolutamente imposibles de implementar en este momento (por ejemplo, Guice, integración Spring). Las cosas parecen funcionar en la superficie, pero una vez que profundizas más, encontrarás muchas características que aún están dañadas.
Muchos de los complementos 1.x no existen en 2.x, principalmente debido a la rotura mencionada anteriormente.
A la luz de esto, sugiero que se retrase Jersey 2.x en el futuro inmediato. Esperemos que los comisionados limpien esto en el próximo año.