2016-10-21 2 views
0

In meiner JEE Anwendung, 3 auf Glassfish laufen, ich habe die folgende Situation:JEE: Wie Parameter Abfangjäger passieren

MyFacade Klasse

@Interceptors(SomeInterceptor.class) 
public void delete(Flag somethingForTheInterceptor, String idToDelete) { 
    ....... 
} 

@Interceptors(SomeInterceptor.class) 
public void update(Flag somethingForTheInterceptor, MyStuff newStuff) { 
    ....... 
} 

Die Variable somethingForTheInterceptor wird nicht verwendet in diese Verfahren werden nur in dem Abfangjäger verwendet:

SomeInterceptor Klasse

@AroundInvoke 
public Object userMayAccessOutlet(InvocationContext ctx) throws Exception { 
    Flag flag = extractParameterOfType(Arrays.asList(ctx.getParameters()), Flag.class); 
    // some checks on the flag 
} 

Irgendwie ist es nicht gut, einen Parameter zu haben, der nicht in der Methode verwendet wird. Gibt es eine andere Möglichkeit, somethingForTheInterceptor an den Abfangjäger zu senden?

UPDATE: Die Anrufer von delete() und update() haben verschiedene Möglichkeiten, die somethingForTheInterceptor Variable zu berechnen. Und das ist keine Konstante. Die für die Berechnung erforderlichen Informationen befinden sich im REST-Aufruf. Die 2 REST-Methoden haben jedoch unterschiedliche Eingabeobjekte, so dass es nicht ausreicht, die HTTP-Anfrage zu injizieren.

Dies sind die Anrufer:

MyResource Klasse

@DELETE 
@Path("/delete/{" + ID + "}") 
public Response delete(@PathParam(ID) final String id) { 
    Flag flag = calculateFlagForInterceptor(id); 
    facade.delete(flag, id); 
} 

@POST 
@Path("/update") 
@Consumes(MediaType.APPLICATION_JSON + RestResourceConstants.CHARSET_UTF_8) 
public Response update(final WebInputDTO updateDetails) throws ILeanException { 
    Flag flag = calculateFlagForInterceptor(updateDetails); 
    facade.update(flag, convertToMyStuff(updateDetails)); 
} 

dachte ich - ist es möglich, dass die Methoden in der Ressource, die Flagge in einer Art Kontext zu setzen, dass sein später in den Interceptor injiziert?

+0

Was dieses Flag Wert sein könnte? Könnte es eine Konstante in der Anmerkung sein? Können Sie die Notwendigkeit dieser Flagge erklären? – AxelH

Antwort

1

In Java EE ermöglichen Interzeptoren das Hinzufügen und Verarbeiten von Vorgängen zu einer Methode. Der Kontext der Interceptor-Ausführung ist also der Kontext der Methode.

Ich dachte - es möglich ist, die Methoden in der Ressource in einer Art Kontext das Flag zu setzen, das kann später in dem Interceptor injiziert werden?

Staless Service sollte privilegiert sein, wenn Sie können. Daher sollten Sie es vermeiden, Daten auf dem Server zu speichern (ThreadLocal, Session, etc ..).

Die erforderlichen Informationen zur Berechnung sind im REST-Aufruf .

Warum? Ein Ruhe-Controller hat keine Aufgabe, Berechnungen und Logik zu machen.

Um Ihr Problem zu lösen, sind Sie sicher, dass Sie die Flag-Berechnung in Ihrem Interceptor nicht bewegen konnten? Durch die Abfangjäger Verantwortung zu verbessern, würden Sie nicht brauchen anly mehr für den Transit der Flagge:

@AroundInvoke 
public Object userMayAccessOutlet(InvocationContext ctx) throws Exception { 
    Flag flag = calculFlag(Arrays.asList(ctx.getParameters())); 
    // some checks on the flag 
} 
+0

Danke, ich habe diese Antwort akzeptiert, da es darauf hinweist, dass eine alternative Lösung Nachteile mit sich bringen kann.Die beste Lösung wird sein, die Methode 'calculateFlag()' im Interceptor zu implementieren, was nicht unmöglich ist. – user1414745

+0

Gern geschehen. In diesem Fall ist Interceptor möglicherweise nicht das am besten geeignete Muster, um auf Ihre Bedürfnisse einzugehen. – davidxxx