ContainerRequestFilter ContainerResponseFilter doesn't get called

前端 未结 4 923
感动是毒
感动是毒 2020-12-09 10:59

I am trying to learn jersey by creating a small RESTful service. I want to use the Filters for specific reasons(Like I want to use the ContainerResponseFilter

相关标签:
4条回答
  • 2020-12-09 11:25

    I added a Jersey Application class and registered the filter in the class, which solved my problem. Also upgraded my jersey version to 2.x from 1.x

    public class MyApplication extends ResourceConfig {
    
        /**
         * Register JAX-RS application components.
         */
        public MyApplication () {
            register(RequestContextFilter.class);
            register(JacksonFeature.class);
            register(CustomerResource.class);
            register(Initializer.class);
            register(JerseyResource.class);
            register(SpringSingletonResource.class);
            register(SpringRequestResource.class);
            register(CustomExceptionMapper.class);
        }
    }
    
    0 讨论(0)
  • 2020-12-09 11:38

    I solved the problem on Wildfly 10 / rest easy like this (CORSFilter is my ContainerResponseFilter):

    import java.util.HashSet;
    import java.util.Set;
    
    import javax.ws.rs.ApplicationPath;
    import javax.ws.rs.core.Application;
    
    @ApplicationPath("/rest")
    public class JaxRsActivator extends Application {
    
        @Override
        public Set<Class<?>> getClasses() {
            final Set<Class<?>> resources = new HashSet<Class<?>>();
    
            resources.add(CORSFilter.class);
    
            return resources;
        }
    }
    
    0 讨论(0)
  • 2020-12-09 11:40

    If you are extending the ResourceConfig class the process of registering all the providers can be tedious one and chances are there that one can even miss few providers.

    What here can be done with a type of ResourceConfig is you can use packages method in the default constructor to specify the packages("") which will contain your rest resources and the providers. For Instance lets say we have a package com.test.poc.rest which contains all the rest services and another package namely com.test.poc.providers then our resourceConig will look like:

    public class CustomResourceConfig extends ResourceConfig{
        public CustomResourceConfig(){
           super();
           packages("com.test.poc.rest;com.test.poc.providers");
           //register any custom features
           register(JacksonFeature.class);         // enabling JSON feature.
        }
    }
    

    and boom jersey will now scan for your webservices annotated with @Path and for the providers annotated with @Provider.

    0 讨论(0)
  • 2020-12-09 11:46

    <init-param>
      <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
      <param-value>org.anchepedheplatform.infrastructure.core.filters.ResponseCorsFilter</param-value>
    </init-param>

    First, I wrote a class which implements com.sun.jersey.spi.container.ContainerResponseFilter

    import javax.ws.rs.core.Response;
    import javax.ws.rs.core.Response.ResponseBuilder;
    
    import com.sun.jersey.spi.container.ContainerRequest;
    import com.sun.jersey.spi.container.ContainerResponse;
    import com.sun.jersey.spi.container.ContainerResponseFilter;
    
    /**
    * Filter that returns a response with headers that allows for Cross-Origin
    * Requests (CORs) to be performed against the platform API.
    */
    public class ResponseCorsFilter implements ContainerResponseFilter {
    
      @Override
      public ContainerResponse filter(final ContainerRequest request, final ContainerResponse   response) { 
          final ResponseBuilder resp = Response.fromResponse(response.getResponse());
          resp.header("Access-Control-Allow-Origin", "*")
          .header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
          final String reqHead = request.getHeaderValue("Access-Control-Request-Headers");
          if (null != reqHead && !reqHead.equals(null)) {
          resp.header("Access-Control-Allow-Headers", reqHead);}
          response.setResponse(resp.build());
          return response;
     }
    

    and later I had put this reference of this class in intit-param web.xml.

    0 讨论(0)
提交回复
热议问题