java - ¿Cómo usar Jersey como implementación JAX-RS sin web.xml?
web-services java-ee (2)
No tiene que especificar nada en web.xml. Defina una clase de activador:
@ApplicationPath("/rest")
public class _JaxRsActivator extends javax.ws.rs.core.Application {
static {
//Check some system init on REST init.
Config.initCheck();
}
}
He leído que desde java EE6 web.xml es opcional. Entonces, sin web.xml, ¿cómo puedo decirle al servidor de aplicaciones que use Jersey como implementación para la especificación JAX-RS?
Lo que @AlexNevidomsky escribió
en su respuesta es correcto, en cuanto a cómo implementar la configuración de la aplicación sin web.xml;
utiliza una anotación
@ApplicationPath
en una subclase de
Application
.
@ApplicationPath("/api")
public class AppConfig extends Application {}
Para obtener más información sobre las opciones de implementación, consulte la especificación JAX-RS -> 2.3 Publicación -> 2.3.2 Servlet
O más comúnmente, con Jersey como implementación, ampliaríamos
ResourceConfig
(que extiende la
Application
).
@ApplicationPath("api")
public class AppConfig extends ResourceConfig {
public AppConfig() {
packages("package.to.scan");
}
}
Entonces, ¿cómo se implementa esto ...
Lo primero es lo primero, no todos los servidores Java EE usan Jersey. En realidad, los únicos que conozco que usan Jersey son Glassfish y WebLogic. JBoss usa Resteasy. Tom EE usa CXF. WebSphere usa Apache Wink. Esos son los únicos en los que puedo pensar.
Así que supongo que la pregunta es "¿Cómo sabe el servidor cómo cargar la aplicación JAX-RS?"
Servlet 3.0 introdujo el mecanismo de capacidad de conexión, que utiliza un
ServletContainerInitializer
.
Su funcionamiento es que cuando se inicia el contenedor Servidor / Servlet, escanea los frascos en busca de una carpeta
META-INF/services
con un archivo llamado
javax.servlet.ServletContainerInitializer
.
Este archivo debe incluir uno o más nombres completos de implementaciones de
ServletContainerInitializer
.
Esta interfaz tiene solo un método
void onStartup(java.util.Set<java.lang.Class<?>> c, ServletContext ctx)
Set<Class<?>
Será una lista de clases que se
@HandlesTypes
los criterios de la anotación
@HandlesTypes
en la implementación de
ServletContainerInitializer
.
Si nos fijamos en la implementación de Jersey
@HandlesTypes({ Path.class, Provider.class, Application.class, ApplicationPath.class })
public final class JerseyServletContainerInitializer
implements ServletContainerInitializer {
Debería notar algunas clases de anotación familiares, así como la clase
Application.class
.
Todas estas clases que coinciden con los criterios, durante el escaneo, se agregan al
Set
pasado al método
onStartup
.
Si escanea el resto del código fuente, verá que todo el registro se realiza con todas esas clases.
Usos de resteasy
@HandlesTypes({Application.class, Path.class, Provider.class})
public class ResteasyServletInitializer implements ServletContainerInitializer
No me meteré con los demás.
Alguna fuente que puedes ver ...