Sto cercando di imparare la maglia creando un piccolo servizio RESTful. Voglio utilizzare i filtri per motivi specifici (ad esempio voglio utilizzare il contenitore ContainerResponseFilter per le intestazioni CORS per consentire richieste tra domini diversi). Tuttavia, non sono in grado di ottenere questi filtri per intercettare la mia chiamata. Ho visto tutti i post per questo problema e molti di loro dicono di registrarsi con il fornitore di annotazioni o in web.xml. Ho provato a registrare i file in web.xml oltre a dare un'annotazione @Provider
per il contenitoreContainerRequestFilter ContainerResponseFilter dosent get called
Ecco il mio 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>
qui sono i miei Filtri:
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 al mio progetto github.
Sono tipo bloccato qui per 2 giorni.
Grazie
Quale contenitore/server di applicazioni e versione di Jersey stai utilizzando? Inoltre, hai provato a registrare i filtri nella tua classe di applicazione Jersey? – Baldy
Sto usando la versione jersey 1.8. Sto usando VMware VFabric fornito con STS. Come registriamo i filtri nella classe di applicazione jersey? – user2973475
Per registrare i tuoi filtri, aggiungili al metodo 'getClasses' nell'oggetto' javax.ws.rs.core.Application' anche se sembra che il tuo web.xml debba gestirlo per te. I tuoi metodi REST vengono chiamati? Come sai che i tuoi filtri non vengono chiamati? – Baldy