Как получить информацию о пользователе непосредственно на уровне JPA в остальных API - PullRequest
0 голосов
/ 01 ноября 2018

Я использую REST api с JPA и получаю информацию о пользователе в разделе заголовка. Для целей аудита необходимо сохранять детали пользователя при каждом запросе. Как напрямую получить информацию о пользователе на уровне JPA (хуки @Prepersist и @PreUpdate) из заголовка rest.

Я не хочу передавать детали через сервисный слой Есть ли общий способ сделать это?

Примечание. Я не использую пружину.

Заранее спасибо.

1 Ответ

0 голосов
/ 01 ноября 2018

У меня была похожая проблема с рамками пружины. Следующая идея может помочь вам.

  1. Создание AppContext с использованием ThreadLocal

    public class AppContext {
    
    private static final ThreadLocal<User> currentUser = new ThreadLocal<>();
    
    public static void setCurrentUser(String tenant) {
        currentUser.set(tenant);
    }
    
    public static String getCurrentUser() {
        return currentUser.get();
    }
    
    public static void clear() {
        currentUser.remove();
    }
    

    }

  2. Используйте фильтр или аналогичный, чтобы получить пользователя из заголовка http и установить AppContext

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
    
         // Your code to extract user info from header
         // Build user object and set to the AppContext
         AppContext.setCurrentUser(user);
    
        //doFilter
        chain.doFilter(httpRequest, response);
    }
    
  3. Использовать AppContext в хранилище. Он должен быть доступен по запросу.

      @PrePersist
      public void onPrePersist() {
        if(AppContext.getCurrentUser() != null){
            this.user = AppContext.getCurrentUser();
         }
    }
    

    }

...