2017-07-18 1 views
0

Je mon service reste en cours d'exécution sur un serveur Jersey configuré comme suit:Comment modifier les en-têtes de réponse en jersey

try { 

    final ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
    context.setContextPath(serverConfig.getContextPath()); 

    final Server jettyServer = new Server(serverConfig.getPort()); 
    jettyServer.setHandler(context); 

    ResourceConfig config = new ResourceConfig(); 
    config.register(CORSResponseFilter.class); 

    final ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, serverConfig.getBaseName()); 

    jerseyServlet.setInitOrder(0); 

    jerseyServlet.setInitParameter("jersey.config.server.provider.packages", "com.myRest.rest"); 
    jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", entryPoints()); 


    jettyServer.start(); 
    jettyServer.join(); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

Je suis en train de modifier les en-têtes de toutes les réponses, de sorte que j'utiliser un filtre:

@Provider 
public class CORSResponseFilter implements ContainerResponseFilter { 

@Override 
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) 
     throws IOException { 

    MultivaluedMap headers = responseContext.getHeaders(); 
    headers.add("Access-Control-Allow-Origin", "*"); 
    headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); 
    headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia"); 
} 
} 

Toutefois, pour une raison quelconque, ce filtre n'est jamais appelé. J'utilise embebed jetty 9.2.13.v20150730. J'ai vu quelques réponses qui suggèrent de changer web.xml, mais je n'utilise pas la configuration de xml.

Répondre

1

pour une raison quelconque, ce filtre est jamais appelé

Parce que vous ne faites rien avec le ResourceConfig que vous vous inscrivez le filtre avec. Au lieu d'utiliser la classe ServletContainer à addServlet, vous pouvez l'instancier en transmettant le ResourceConfig au constructeur.

ServletHolder jerseyServlet = new ServletHolder(new ServletContainer(config)); 
jerseyServlet.setInitOrder(0); 
context.addServlet(jerseyServlet, serverConfig.getBaseName()); 

également au lieu d'utiliser les paramètres d'initialisation, vous pouvez simplement vous inscrire tout au ResourceConfig. Vous pouvez définir l'analyse de package à l'aide de la méthode packages et enregistrer simplement tous les fournisseurs avec la méthode register (au lieu d'utiliser les noms de classe String avec init-param).

ResourceConfig config = new ResourceConfig() 
    .packages("com.myRest.rest") 
    .register(CORSResponseFilter.class) 
    .register(AnyOtherProviderClass.class) 
    .register(LikeTheOnesYouListedInThe_entryPoints.class)