Ich habe einen @AroundInvoke-REST-Web-Service-Interceptor, den ich für die Protokollierung allgemeiner Daten wie Klasse und Methode, Remote-IP-Adresse und Antwortzeit verwenden möchte.JEE6-REST-Dienst @AroundInvoke Interceptor injiziert ein Null-HttpServletRequest-Objekt
Das Abrufen des Klassen- und Methodennamens ist mit InvocationContext einfach, und die Remote-IP ist über den HttpServletRequest verfügbar, solange der abgefangene Restdienst einen @Context HttpServletRequest in seiner Parameterliste enthält.
jedoch einige REST-Methoden haben keine HttpServletRequest in ihren Parametern, und ich kann nicht herausfinden, wie ein HttpServletRequest Objekt in diesen Fällen zu erhalten.
Zum Beispiel die folgenden REST Web-Service nicht über die @Context HttpServletRequest Parameter
@Inject
@Default
private MemberManager memberManager;
@POST
@Path("/add")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Member add(NewMember member) throws MemberInvalidException {
return memberManager.add(member);
}
Ich habe versucht, es direkt in mein Interceptor Injektion, sondern (auf JBoss 6.1) ist es immer null ...
public class RestLoggedInterceptorImpl implements Serializable {
@Context
HttpServletRequest req;
@AroundInvoke
public Object aroundInvoke(InvocationContext ic) throws Exception {
logger.info(req.getRemoteAddr()); // <- this throws NPE as req is always null
...
return ic.proceed();
würde Ich mag Rat eines zuverlässigen Weg, um das HttpServletRequest Objekt zuzugreifen - oder auch nur die HTTP-Header ... unabhängig davon, ob ein REST-Service umfasst den Parameter.
Bedeutet dies bedeutet, dass Sie eine @Context HttpServletRequest enthalten haben Parameter in jeder REST-Methode Ihrer Anwendung? Es muss ein besserer Weg sein. Ich bin ziemlich neu in Java EE6 und ich kämpfe mit einem sehr ähnlichen, wenn nicht das gleiche Problem. Ich habe hier eine Frage geschrieben, es fragt nicht dasselbe, aber es kommt darauf an: Ich muss die Sitzung auf dem Abfangjäger überprüfen, um eine Autorisierung durchzuführen. http://stackoverflow.com/questions/19453557/injection-to-an-interceptor-whats-missing – noinstance
@nosuchnick Ich dachte auch "es muss einen besseren Weg geben", deshalb habe ich die Frage gestellt. Dies scheint einer dieser JEE6-kleinen Ärgernisse zu sein, bei denen das Hinzufügen eines Interceptors Änderungen am abgefangenen Code erfordert. –
Sicher. Am Ende habe ich die gesamte Session-Verwaltung in einer '@ SessionScoped'-Bean gemacht und sie in den Interceptor injiziert. Ich kann dann seine Methoden dort anwenden. – noinstance