web-dev-qa-db-de.com

ContainerRequestFilter ContainerResponseFilter wird nicht aufgerufen

Ich versuche, Trikot zu lernen, indem ich einen kleinen RESTful-Service schaffe. Ich möchte die Filter aus bestimmten Gründen verwenden (zB möchte ich die ContainerResponseFilter für CORS - Header verwenden, um domänenübergreifende Anforderungen zuzulassen). Ich kann diese Filter jedoch einfach nicht abrufen. Ich habe alle Beiträge zu diesem Problem gesehen, und die meisten sagen, dass sie sich bei Annotation Provider oder in web.xml .. registrieren. Ich habe versucht, die Dateien in web.xml zu registrieren und eine @Provider-Annotation für der Kontainer

Hier ist meine web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- This web.xml file is not required when using Servlet 3.0 container, 
     see implementation details http://jersey.Java.net/nonav/documentation/latest/jax-rs.html#d4e194 -->
<web-app version="2.5" xmlns="http://Java.Sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/classes/spring/config/BeanLocations.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>com.Sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.Sun.jersey.config.property.packages</param-name>
            <param-value>com.rest.example</param-value>
        </init-param>
        <init-param>  
            <param-name>jersey.config.server.provider.packages</param-name>  
            <param-value>com.rest.example.cors</param-value>
        </init-param>
        <init-param>
            <param-name>com.Sun.jersey.spi.container.ContainerResponseFilters</param-name>
            <param-value>com.rest.example.CORSFilter</param-value>
        </init-param>
        <init-param>
            <param-name>com.Sun.jersey.spi.container.ContainerRequestFilters</param-name>
            <param-value>com.rest.example.RequestFilter</param-value>
        </init-param>

    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webresources/*</url-pattern>
    </servlet-mapping>

</web-app>

Hier sind meine Filter:

package com.rest.example.cors;

import javax.ws.rs.ext.Provider;

import com.Sun.jersey.spi.container.ContainerRequest;
import com.Sun.jersey.spi.container.ContainerResponse;
import com.Sun.jersey.spi.container.ContainerResponseFilter;

@Provider
public class CORSFilter implements ContainerResponseFilter {

    public ContainerResponse filter(ContainerRequest creq,
            ContainerResponse cresp) {

             cresp.getHttpHeaders().putSingle("Access-Control-Allow-Origin", "*");
             cresp.getHttpHeaders().putSingle("Access-Control-Allow-Credentials", "true");
             cresp.getHttpHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD");
             cresp.getHttpHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With");

            return cresp;
    }
}


package com.rest.example.cors;

import javax.ws.rs.ext.Provider;

import com.Sun.jersey.spi.container.ContainerRequest;
import com.Sun.jersey.spi.container.ContainerRequestFilter;

@Provider
public class RequestFilter implements ContainerRequestFilter {

    public ContainerRequest filter(ContainerRequest request) {
        System.out.println("request filter");
        return request;
    }
}

Link zu meinem Github-Projekt.

12
user2973475

Ich habe eine Jersey-Anwendungsklasse hinzugefügt und den Filter in der Klasse registriert, wodurch mein Problem gelöst wurde. Außerdem wurde meine Trikotversion von 1.x auf 2.x aktualisiert

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);
    }
}
10
user2973475

Ich habe das Problem auf Wildfly 10/Rest easy so gelöst (CORSFilter ist mein 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;
    }
}
5
mvera

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

Zuerst habe ich eine Klasse geschrieben, die com.Sun.jersey.spi.container.ContainerResponseFilter implementiert.

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;
 }

und später hatte ich diese Referenz dieser Klasse in intit-param web.xml eingefügt.

1
goutham

Wenn Sie die ResourceConfig-Klasse erweitern, kann der Registrierungsprozess für alle Anbieter sehr langwierig sein, und es besteht die Möglichkeit, dass nur wenige Anbieter fehlen.

Was hier mit einem Typ von ResourceConfig geschehen kann, ist, dass Sie die Packages-Methode im Standardkonstruktor verwenden können, um das packages("") anzugeben, das Ihre Restressourcen und die Provider enthält. Zum Beispiel haben wir ein Paket com.test.poc.rest, das alle übrigen Services enthält, und ein anderes Paket, nämlich com.test.poc.providers, dann sieht unser resourceConig so aus:

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.
    }
}

boom Jersey sucht nun nach Ihren mit @Path kommentierten Webservices und nach den mit @Provider kommentierten Anbietern.

0
Najeeb Arif