jersey - Cómo aplicar interceptores y filtros a los servicios de descanso en Weblogic 12c
jax-rs weblogic12c (2)
Entiendo que Weblogic 12c v12.2.1 usa Jersey como una implementación de JAX-RS . Así que seguí las instrucciones en esta página, pero no he logrado declarar un interceptor, ya sea usando el enlace de nombre o enlace dinámico (es decir, más información en el enlace mencionado)
Mi aplicación está funcionando normalmente porque puedo llamar a los servicios de descanso, pero no puedo aplicar filtros o interceptores, nunca están involucrados en el proceso.
No javax.ws.rs.core.Application
web.xml , todo lo que tengo es una clase javax.ws.rs.core.Application
child
@ApplicationPath("rs")
public class MyApp extends Application {
private Set<Object> singletons = new HashSet<Object>();
private Set<Class<?>> empty = new HashSet<Class<?>>();
public MyApp() {
singletons.add(new MyService());
}
@Override
public Set<Class<?>> getClasses() {
return empty;
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
}
Mi clase de servicio se ve así
@Path("")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public class MyService {
private static final Logger log = Logger.getLogger(MyService.class);
@GET
@Path("login")
public Status login(@QueryParam(USERNAME_PARAM) String username, @QueryParam(PASSWORD_PARAM) String password, @Context HttpServletRequest request) {
return new Status(ServiceMessages.USER_AUTHENTICATION_SUCCESS);
}
Tengo un valor @Path
vacío porque no puedo excluirlo, ya he especificado mi ruta en la clase MyApp y no quiero especificar una ruta a esta clase.
Mi clase vinculante
import javax.ws.rs.container.DynamicFeature;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.FeatureContext;
import com.mycompany.ws.filters.GZIPCompressor;
public class GzipDynamicBinder implements DynamicFeature {
@Override
public void configure(ResourceInfo resourceInfo, FeatureContext context) {
context.register(GZIPCompressor.class);
}
}
Mi clase de interceptor
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.ext.ReaderInterceptor;
import javax.ws.rs.ext.ReaderInterceptorContext;
import javax.ws.rs.ext.WriterInterceptor;
import javax.ws.rs.ext.WriterInterceptorContext;
public class GZIPCompressor implements WriterInterceptor, ReaderInterceptor {
@Override
public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException {
System.out.println(">>> Compression Reader <<<");
context.setInputStream(new GZIPInputStream(context.getInputStream()));
return context.proceed();
}
@Override
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
System.out.println(">>> Compressor Writer <<<");
context.setOutputStream(new GZIPOutputStream(context.getOutputStream()));
context.proceed();
}
}
Agradezco todas las respuestas, pero realmente me gustaría una respuesta que no tenga nada que ver con el archivo web.xml .
- La versión de Weblogic JAX-RS es 1.1 (no puedo encontrar el concepto de filtros o interceptores en ningún lado)
- La versión de Weblogic Jersey es 1.17 , y estaba haciendo referencia a la documentación de la última versión, que es 2.6 en este momento.
Creo que lo que te falta aquí es la anotación @Provider en tu clase GZIPCompressor. Agregar eso debería asegurar que se llame al interceptor. Consulte esta entrada de blog para conocer los pasos detallados sobre la aplicación de interceptores: http://stick2code.blogspot.in/2015/02/performing-gzip-compression-in-jaxrs-20.html