maillot 2.2: ContainerResponseFilter et ContainerRequestFilter jamais exécuté
Suivant le guide de mise en route sur le Maillot, site web:
J'ai exécuté la génération suivante de commande:
$ mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 \
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
-DgroupId=com.example -DartifactId=simple-service -Dpackage=com.example \
-DarchetypeVersion=2.2
J'ai ensuite suivi le tutoriel sur
https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e6783
d'ajouter des ContainerResponseFilter:
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
static @interface CORSBinding {}
@Provider
@Priority(Priorities.HEADER_DECORATOR)
@CORSBinding
static class CrossDomainFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext creq, ContainerResponseContext cres) {
Logger.getLogger("com.example").log( Level.INFO, "before: {0}", cres.getHeaders());
cres.getHeaders().add("Access-Control-Allow-Origin", "*");
cres.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
cres.getHeaders().add("Access-Control-Allow-Credentials", "true");
cres.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
cres.getHeaders().add("Access-Control-Max-Age", "1209600");
Logger.getLogger("com.example").log( Level.INFO, "after: {0}", cres.getHeaders());
}
}
@Provider
static class MyResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
System.out.println("MyResponseFilter.postFilter() enter");
responseContext.setEntity(
responseContext.getEntity() + ":" + getClass().getSimpleName(), null, MediaType.TEXT_PLAIN_TYPE);
System.out.println("MyResponseFilter.postFilter() exit");
}
}
...
@GET
@Produces(MediaType.TEXT_PLAIN)
@CORSBinding
public String helloWorld() {
return "hello world";
}
J'ai essayé d'enregistrer ce filtre Nommés de Liaison et de Liaison Dynamique, rien ne fonctionne.
À reproduire facilement, j'ai aussi essayé un exemple de l'autorité de ressources:
https://github.com/jersey/jersey/tree/2.2/examples/exception-mapping
Le même problème: les filtres personnalisés ne soit pas exécutée.
Est-ce un Grizzly problème?
- Comment est-ce que votre classe de ressource ressembler? Est votre ressource la méthode annotée avec @CorsBinding ainsi?
- Oui, j'ai ajouté le code manquant.
Vous devez vous connecter pour publier un commentaire.
Il s'avère que vous devez enregistrer manuellement les classes personnalisées - comme dans:
Exemple complet:
Ajoutant le code suivant dans web.xml à l'aide de conteneur Tomcat est ce qui a fonctionné pour moi:
Mes remerciements vont à:
http://blog.dejavu.sk/2013/11/19/registering-resources-and-providers-in-jersey-2/