0

L'API Java servlet ne fournit pas de méthode getStatus pour HttpServletResponse jusqu'à la version 3.0. J'ai créé un HttpServletResponseWrapper avec getStatus pour envelopper HttpServletResponse et attraper le statut quand il est défini.Le code d'état de Jersey 2 n'est pas visible dans HttpServletResponseWrapper

Cela ne fonctionne pas avec ma servlet Jersey 2.

Mon HttpServletResponseWrapper est passé via le doFilter (request, wrapperResponse) de mon filtre. Le filtre est appelé mais la méthode getStatus n'est pas appelée lorsqu'un servlet RESTful de Jersey est le point de terminaison.

Y at-il une configuration que j'ai manquée? J'utilise le générateur de réponse pour renvoyer le résultat et définir le statut.

Response.status (404) .build(); Response.status (200) .type (mediaType) .entity (theEntity) .build();

Cordialement Jochen

+0

Pour quoi avez-vous besoin d'un 'HttpServletResponseWrapper'? –

+0

Pour obtenir le code d'état du filtre gzip, pas d'en-tête gzip sur les réponses 404 ou 204. – ScubaInstructor

Répondre

0

Vous n'avez pas besoin HttpServletResponseWrapper pour la compression GZIP. Il pourrait être atteint avec un WriterInterceptor de JAX-RS:

public class GZIPWriterInterceptor implements WriterInterceptor { 

    @Override 
    public void aroundWriteTo(WriterInterceptorContext context) 
       throws IOException, WebApplicationException { 
     final OutputStream outputStream = context.getOutputStream(); 
     context.setOutputStream(new GZIPOutputStream(outputStream)); 
     context.proceed(); 
    } 
} 

Alors inscrivez-vous le WriterInterceptor dans votre ResourceConfig/Application sous-classe:

@ApplicationPath("/api") 
public class MyApplication extends ResourceConfig { 

    public MyApplication() { 
     register(GZIPWriterInterceptor.class); 
    } 
} 

Pour lier l'intercepteur à certaines méthodes de ressources ou de classes, vous pouvez utilisez name binding annotations.

+0

Ça a marché. Ce WriterInterceptor est seulement déclenché quand j'envoie une entité est grande, donc mon cas 404 et 204 est couvert. Mais comment puis-je ignorer ce gzip si la requête ne contient pas l'en-tête Accept-Encoding: gzip, deflate, br? – ScubaInstructor

+0

@ScubaInstructor Vous devriez pouvoir injecter les en-têtes de requête dans votre intercepteur en utilisant '@Context HttpHeaders httpHeaders'. –

+0

Je vais aller maintenant avec cette solution EncodingFilter.enableFor (ceci, GZipEncoder.class, DeflateEncoder.class); et passez le WriterInterceptor. – ScubaInstructor