2014-01-10 5 views
5

Wenn ich eine einzelne Klasse habe, die sowohl vor als auch nach dem Prozess implementiert, kann ich Dinge auf dem Objekt zwischen dem preProcess-Aufruf und dem postProcess-Aufruf speichern?Sind Resteasy-Interceptors sicher zwischen preProcess und postProcess?

Also wirklich wäre das legal?

@ServerInterceptor 
@Provider 
public class MyInterceptor implements PreProcessInterceptor, PostProcessInterceptor { 

    private String url; 

    @Override 
    public ServerResponse preProcess(HttpRequest request, ResourceMethod resourceMethod) throws Failure, WebApplicationException { 
     url = request.getUri().getRequestUri().toString(); 
     return null; 
    } 

    @Override 
    public void postProcess(ServerResponse response) { 
     System.out.println(url); 
    } 
} 

Antwort

2

OK, ich habe Experimente liefen und die Antwort scheint in Ruhe leicht 2.01GA läuft in JBoss jboss-as-7.1.1.Final ich verschiedene Instanzen für den Vorprozess bekommen und nachbearbeiten zu sein, dass.

Also die Antwort auf "wäre das legal?" ist NEIN.

Um dieses Problem zu umgehen Ich bin auch der Kontext des HttpServletRequest und Speichern des Zustands als Anforderung Attribut:

@ServerInterceptor 
@Provider 
public class MyInterceptor implements PreProcessInterceptor, PostProcessInterceptor { 

    private static final String ATTRIBUTE_NAME = MyInterceptor.class.getName(); 

    @Context 
    HttpServletRequest servletRequest; 

    @Override 
    public ServerResponse preProcess(HttpRequest request, ResourceMethod resourceMethod) throws Failure, WebApplicationException { 
     String url = request.getUri().getRequestUri().toString(); 
     servletRequest.setAttribute(ATTRIBUTE_NAME, url); 
     return null; 
    } 

    @Override 
    public void postProcess(ServerResponse response) { 
     String url = servletRequest.getAttribute(ATTRIBUTE_NAME); 
     System.out.println(url); 
    } 
} 

ich für meine Verwendung fanden diese nicht ausreichend war, als das Nachbearbeiten nicht genannt wird Wenn ein Fehler aufgetreten ist (401, 500 usw.), habe ich am Ende eine javax.servlet.Filter

verwendet