2014-05-15 10 views
9

Ich versuche Jersey zu lernen, indem ich einen kleinen RESTful Service erstelle. Ich möchte die Filter für bestimmte Gründe verwenden (Ich möchte die ContainerResponseFilter für CORS Header verwenden, um domänenübergreifende Anfragen zuzulassen). Ich bin jedoch nicht in der Lage, diese Filter meinen Anruf abzufangen. Ich habe alle Posts für dieses Problem gesehen und die meisten sagen, dass sie sich bei Annotation Provider oder in web.xml registrieren. Ich habe versucht, die Dateien auch in web.xml Registrierung als @Provider Anmerkung für den Behälter gebenContainerRequestFilter ContainerResponseFilter dosent get

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.

Ich bin hier für 2 Tage fest.

Dank

+0

Welchen Container/App-Server und welche Version von Jersey verwenden Sie? Haben Sie auch versucht, Ihre Filter in Ihrer Jersey Application-Klasse zu registrieren? – Baldy

+0

Ich benutze Jersey Version 1.8. Ich verwende den VMware VFabric, der mit STS geliefert wird. Wie registrieren wir die Filter in der Jersey-Anwendungsklasse? – user2973475

+0

Um Ihre Filter zu registrieren, fügen Sie sie zur 'getClasses' Methode in Ihrem' javax.ws.rs.core.Application' Objekt hinzu, obwohl es scheint, dass Ihre web.xml das für Sie behandeln sollte. Werden Ihre REST-Methoden aufgerufen? Woher wissen Sie, dass Ihre Filter nicht aufgerufen werden? – Baldy

Antwort

7

Ich habe Klasse eine Jersey-Anwendung und registriert den Filter in der Klasse, die mein Problem gelöst. Auch mein Trikot Version aktualisiert auf 2.x von 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); 
    } 
} 
+2

die für mich in Jersey 2.24 Einsatz in Tomcat 8.5, aber ich musste auch registrieren, um die Anwendungsklasse in 'web.xml' arbeitete wie folgt:' javax.ws.rs.Application MyApplication '(innerhalb der Servletdefinition für' org.glassfish.jersey.servlet.ServletContainer') –

1

<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 schrieb ich eine Klasse, die 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; 
} 

implementiert und später hatte ich setzen Diese Referenz dieser Klasse in init-param web.xml.

+1

Wird der von Ihnen angegebene Code hier verwendet [CORS-Compliant REST API mit Jersey und ContainerResponseFilter] (http://blog.usul.org/ cors-compliant-Rest-api-mit-Jersey-und-Container-Antwortfilter /)? – Athafoud

3

löste ich das Problem auf Wildfly 10/Rest einfach so (CORSFilter meine ContainerResponseFilter ist):

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

Danke das war mein Problem auch. –

0

Wenn Sie das Verfahren die ResourceConfig Klasse erweitern alle Anbieter Registrierung langwierig und die Chancen sein können gibt es da, dass man sogar wenige Anbieter verpassen kann.

Was hier mit einem Typ von ResourceConfig getan werden kann, ist, können Sie Packages-Methode im Standardkonstruktor verwenden, um die packages("") anzugeben, die Ihre Ruhe Ressourcen und die Anbieter enthält. Zum Beispiel können sagen, dass wir ein Paket com.test.poc.rest haben, die nämlich alle übrigen Dienstleistungen und ein anderes Paket enthält com.test.poc.providers dann unsere resourceConig aussehen wird:

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

und Boom Trikot für einen Web Service mit @Path und für die Anbieter kommentierten scannen kommentiert mit @Provider.