ContainerRequestFilter ContainerResponseFilter nicht genannt
Ich versuche zu lernen, jersey, indem Sie ein kleines Rest-Dienst. Ich möchte die Verwendung der Filter, die aus bestimmten Gründen(Wie ich das ContainerResponseFilter für CORS - Header, um einen cross-domain-requests). Aber ich bin einfach nicht in der Lage, diese Filter abzufangen meinen Anruf. Ich habe gesehen, alle Beiträge für dieses problem und die meisten von Ihnen sagen, um sich mit annotation-provider oder in web.xml.
Ich habe versucht, die Registrierung der Dateien in web.xml sowie das geben ein @Provider
Anmerkung für den container
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 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.
- Was container - /app-server und die version von Jersey verwenden Sie? Auch haben Sie versucht, die Registrierung Ihrer Filter in Ihre Jersey-Application-Klasse?
- Im mit jersey-version 1.8. Im mit der VMware VFabric kommt mit STS. Wie registrieren wir die Filter in jersey-application-Klasse?
- Registrieren Sie Ihre Filter, fügen Sie Sie der
getClasses
Methode in Ihrerjavax.ws.rs.core.Application
Objekt, obwohl es scheint, Ihre web.xml sollte die Handhabung für Sie. Sind Ihre REST-Methoden aufgerufen werden? Wie wissen Sie, dass Ihr Filter nicht aufgerufen wird? - Meine REST-Methoden aufgerufen werden. Ich einen debug-Punkt in meinem Filter und den code nie zuvor den debug-Punkt, aber es trifft den Ressource-Methoden.
- fügen Sie einfach die Pakete, die details enthalten alle Filter, die in Ihrem ResourceConfig. Ich habe geschrieben man exapmle auch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe eine Jersey-Applikation Klasse und registriert die filter in der Klasse, die mein problem gelöst. Auch ein Upgrade mein Trikot version 2.x von 1.x
web.xml
wie folgt:<init-param><param-name>javax.ws.rs.Application</param-name><param-value>MyApplication</param-value></init-param>
(innerhalb des servlet-definition fürorg.glassfish.jersey.servlet.ServletContainer
)Ich das problem gelöst, auf Wildfly 10 /rest einfach wie dieses (CORSFilter ist mein ContainerResponseFilter):
HTML:
Zuerst schrieb ich eine Klasse, die implementiert
com.sun.jersey.spi.container.ContainerResponseFilter
und später hatte ich diese Referenz dieser Klasse in intit-param web.xml.
Wenn Sie den ausbau der
ResourceConfig
Klasse, in der der Prozess der Registrierung alle Anbieter können langwierig und die Chancen sind da, die kann man auch verpassen, wenigen Anbieter.Was hier getan werden kann, mit einer Art von
ResourceConfig
ist können Sie Pakete verwenden-Methode in der default-Konstruktor angeben, diepackages("")
enthalten wird Ihren rest-Ressourcen und den Anbietern. Zum Beispiel können sagen, wir haben ein Paketcom.test.poc.rest
enthält alle rest-services und ein anderes Paket, nämlichcom.test.poc.providers
dann unsere resourceConig Aussehen wird:und boom jersey wird nun der scan für webservices kommentiert mit
@Path
- und für die Anbieter versehen mit@Provider
.