5

Ich benutze die neueste Spring Data Rest und ich handle das Ereignis "vor dem Erstellen". Die Anforderung besteht darin, auch die HTTP-Header zu erfassen, die an den POST Endpunkt für das Modell "Client" gesendet wurden. Die Schnittstelle für den RepositoryEventHandler stellt das jedoch nicht bereit.Spring Data Rest - So erhalten Sie Header in @RepositoryEventHandler

@Component 
@RepositoryEventHandler 
public class ClientEventHandler { 

    @Autowired 
    private ClientService clientService; 

    @HandleBeforeCreate 
    public void handleClientSave(Client client) { 
    ... 
    ... 
    } 
} 

Wie können wir Ereignisse verarbeiten und die HTTP-Header erfassen? Ich hätte gerne Zugriff auf den Parameter wie Spring MVC, die die @RequestHeader HttpHeaders Header verwendet.

+0

Ich habe dich nicht getestet, aber können '@ Autowired' die 'HttpServletRequest' direkt wie '@Autowired \t private HttpServletRequest Anfrage;' dann verwenden Sie 'request.getHeader (" User-Agent ")' .Können Sie bitte Beispiel hier https://www.mkyong.com überprüfen/java/how-to-get-http-anfrage-header-in-java/ –

+0

HttpServletRequest ist keine von Spring verwaltete Bean und kann daher nicht automatisch gestartet werden. –

+0

Ohne einen benutzerdefinierten Controller wäre eine Idee ein Servlet-Filter, der die erforderlichen Werte mit einem ThreadLocal an den aktuellen Thread bindet und sie über einen statischen Aufruf verfügbar macht. Siehe zum Beispiel http://veerasundar.com/blog/2010/11/java-thread-local-how-to-use-and-code-sample/ oder http://blog.smartbear.com/programming/how- und-wenn-zu-verwenden-javas-threadlocal-object/ –

Antwort

6

Sie können einfach die Anfrage auf ein Feld Ihrer Eventhandler

@Component 
@RepositoryEventHandler 
public class ClientEventHandler { 
    private HttpServletRequest request; 

    public ClientEventHandler(HttpServletRequest request) { 
     this.request = request; 
    } 

    @HandleBeforeCreate 
    public void handleClientSave(Client client) { 
     System.out.println("handling events like a pro"); 
     Enumeration<String> names = request.getHeaderNames(); 
     while (names.hasMoreElements()) 
      System.out.println(names.nextElement()); 
    } 
} 

Im Code autowire I Constructor Injection verwendet, die ich denke, das sauberste, aber Feld oder Setter Injektion sollte genauso gut funktionieren.

Ich fand die Lösung auf Stackoverflow: Spring: how do I inject an HttpServletRequest into a request-scoped bean?

Oh, und ich gerade bemerkt @Marc dies in thecomments vorgeschlagen ... aber ich versuchte es tatsächlich :)

+0

Sie haben vergessen, '@ Autowired' hinzuzufügen –

+1

Es ist nicht notwendig, wenn es einen einzigen Konstruktor gibt –

+2

Man kann sich fragen (ich tat), wie es möglich ist, dass der injizierte' HttpServletRequest' tatsächlich auf die aktuelle Anfrage verweist, obwohl die 'ClientEventHandler' Klasse ist eine '@ Component' (und somit ein Singleton). Nun, wenn ein bereichsbasiertes Bean (z. B. request-scoped wie "HttpServletRequest") in eine Bean eines langlebigeren Bereichs (wie "@ Component") injiziert wird, wird tatsächlich ein AOP-Proxy anstelle des Beans injiziert. Der Proxy sendet dann Aufrufe an die tatsächliche Bean-Instanz im aktuellen Bereich. – jannis

Verwandte Themen