jersey 2.2: ContainerResponseFilter and ContainerRequestFilter never get executed

14,743

Solution 1

As it turns out you have to manually register the 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);
    }
    ...
}

Solution 2

Adding the following code in web.xml using 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>`

My thanks goes to:

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

Share:
14,743
bey
Author by

bey

Updated on July 19, 2022

Comments

  • bey
    bey almost 2 years

    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
    

    I then followed the tutorial on

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

    to add a custom ContainerResponseFilter:

    @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 to register this filter with Named Binding and with Dynamic Binding, nothing works.

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

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

    The same problem: the custom filters do not get executed.

    Is this a Grizzly problem?