Jersey 2.2: ContainerResponseFilter and ContainerRequestFilter never execute

Following the getting started guide on the Jersey website:

I executed the following build command:

$ mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 \ -DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \ -DgroupId=com.example -DartifactId=simple-service -Dpackage=com.example \ -DarchetypeVersion=2.2 

Then I followed the tutorial on

https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e6783

add custom ContainerResponseFilter file:

 @NameBinding @Retention(RetentionPolicy.RUNTIME) static @interface CORSBinding {} @Provider @Priority(Priorities.HEADER_DECORATOR) @CORSBinding static class CrossDomainFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext creq, ContainerResponseContext cres) { Logger.getLogger("com.example").log( Level.INFO, "before: {0}", cres.getHeaders()); cres.getHeaders().add("Access-Control-Allow-Origin", "*"); cres.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization"); cres.getHeaders().add("Access-Control-Allow-Credentials", "true"); cres.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); cres.getHeaders().add("Access-Control-Max-Age", "1209600"); Logger.getLogger("com.example").log( Level.INFO, "after: {0}", cres.getHeaders()); } } @Provider static class MyResponseFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { System.out.println("MyResponseFilter.postFilter() enter"); responseContext.setEntity( responseContext.getEntity() + ":" + getClass().getSimpleName(), null, MediaType.TEXT_PLAIN_TYPE); System.out.println("MyResponseFilter.postFilter() exit"); } } ... @GET @Produces(MediaType.TEXT_PLAIN) @CORSBinding public String helloWorld() { return "hello world"; } 

I tried registering this filter with Named Binding and with Dynamic Binding, nothing works.

To easily reproduce, I also tried an example from official resources:

https://github.com/jersey/jersey/tree/2.2/examples/exception-mapping

Same problem: custom filters are not executed.

Is this a grizzly issue?

+6
source share
2 answers

As it turns out, you have to manually register custom classes - as in:

 rc.register(com.dummy.mypackage.CORSResponseFilter.class); 

Full example:

 /** * Main class. * */ public class Main { // Base URI the Grizzly HTTP server will listen on public static final String BASE_URI = "http://192.168.1.34:8080/myapp/"; /** * Starts Grizzly HTTP server exposing JAX-RS resources defined in this application. * @return Grizzly HTTP server. */ public static HttpServer startServer() { // create a resource config that scans for JAX-RS resources and in com.example package final ResourceConfig rc = new ResourceConfig().packages("com.dummy.mypackage"); //NEW: register custom ResponseFilter rc.register(com.dummy.mypackage.CORSResponseFilter.class); // Register Jackson JSON rc.packages("org.glassfish.jersey.examples.jackson").register(JacksonFeature.class); // create and start a new instance of grizzly http server // exposing the Jersey application at BASE_URI return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc); } ... } 
+7
source

Adding the following code to web.xml using the Tomcat container is what worked for me:

 <init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>my.package.SecurityRequestFilter;org.glassfish.jersey.filter.LoggingFilter</param-value> </init-param>` 

I thank:

http://blog.dejavu.sk/2013/11/19/registering-resources-and-providers-in-jersey-2/

+6
source

Source: https://habr.com/ru/post/953962/


All Articles