5

Я использую последний Spring Data Rest, и я обрабатываю событие «перед созданием». Требование, которое у меня есть, - также захватить заголовки HTTP, отправленные на конечную точку POST для модели «Клиент». Однако интерфейс для RepositoryEventHandler не предоставляет этого.Spring Data Rest - Как получить заголовки в @RepositoryEventHandler

@Component 
@RepositoryEventHandler 
public class ClientEventHandler { 

    @Autowired 
    private ClientService clientService; 

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

Как мы можем обрабатывать события и захватывать заголовки HTTP? Я хотел бы иметь доступ к параметру Spring MVC, который использует заголовки @RequestHeader HttpHeaders.

+0

Я не проверял, но вы можете '@ Autowired'' HttpServletRequest 'непосредственно, как' @Autowired \t частный запрос HttpServletRequest; 'затем использовать' request.getHeader («user-agent») '. Можете ли вы проверить пример здесь https://www.mkyong.com/java/how-to-get-http-request-header-in-java/ –

+0

HttpServletRequest не является управляемым компонентом Spring, поэтому он не может быть автообновлен. –

+0

Без настраиваемого контроллера одной идеей будет фильтр Сервлета, который связывает требуемые значения с текущим потоком с помощью ThreadLocal и делает их доступными через статический вызов. См. Например http://veerasundar.com/blog/2010/11/java-thread-local-how-to-use-and-code-sample/ или http://blog.smartbear.com/programming/how- и-когда-к-использованию-javas-threadlocal-object/ –

ответ

6

Вы можете просто autowire запрос на поле вашего 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()); 
    } 
} 

В коде, приведенном я использовал Constructor Injection, который я думаю, является самым чистым, но поле или сеттер инъекции должны работать так же хорошо.

я действительно нашел решение на StackOverflow: Spring: how do I inject an HttpServletRequest into a request-scoped bean?

Ой, и я только что заметил, @Marc предложил это в thecomments ... но я на самом деле пробовал :)

+0

Вы забыли добавить '@ Autowired' –

+1

Это не обязательно, если есть один конструктор –

+2

Можно спросить себя (я сделал), как возможно, что введенный' HttpServletRequest' фактически ссылается на текущий запрос, хотя класс 'ClientEventHandler' '@ Component' (и, следовательно, одноэлементный). Хорошо, когда облачный объект (например, с запросом, подобный «HttpServletRequest») вводится в компонент более долгоживущей области (например, '@ Component'), тогда на самом деле вместо bean-кода вводится прокси-сервер AOP. Затем прокси-сервер отправляет вызовы к фактическому экземпляру компонента в текущей области. – jannis

 Смежные вопросы

  • Нет связанных вопросов^_^