Ожидание несоответствующего типа в @Query с выражением безопасности

#spring #spring-data

#весна #spring-данные #spring

Вопрос:

В настоящее время я пытаюсь использовать @Query с выражением spring security, чтобы сопоставить любого пользователя, который принадлежит к тому же региону / местоположению, что и вошедший в систему пользователь.

Я использую следующий код для достижения этой цели

 @Override
@Query(value = "select u from User u where u.region in :#{principal.region}")
Page<User> findAll(Pageable var1);
  

Моя пользовательская таблица имеет следующую связь с регионом

 @ManyToMany( mappedBy = "users")
private List<Region> region = new ArrayList<>();
  

Моя таблица регионов имеет следующую связь с пользователями

 @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(name = "region_users", joinColumns = @JoinColumn(name = "region_id", referencedColumnName= "id"),
        inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id")
)
private List<User> users = new ArrayList<>();
  

мой пользовательский основной объект имеет следующее поле region

 private List<Region> region;

public UserPrincipal(Long id, String username, String password,
                     Collection<? extends GrantedAuthority> authorities, Role role, List<Region> region) {
    this.id = id;
    this.username = username;
    this.password = password;
    this.authorities = authorities;
    this.role = role;
    this.region = region;
}
  

с помощью следующего метода get

 public List<Region> getRegion() { return this.region; }
  

Когда я делаю запрос к конечной точке api, которая использует переопределенный метод find all, я получаю следующее исключение

Вызвано: java.lang.Исключение IllegalArgumentException: Значение параметра [com.example.ReportTool.model.Регион@18ab655a] не соответствует ожидаемому типу [java.util.Коллекция (n/a)]

Кто-нибудь может помочь мне с этим вопросом? также, если этот вопрос слишком расплывчатый, пожалуйста, дайте мне знать.

Комментарии:

1. Вам необходимо указать принципал в качестве параметра. Page<User> findAll(Pageable var1, UserPrincipal principal);

2. Я должен был упомянуть, что я использую Spring data rest и переопределяю метод Find all в PagingAndSortingRepository, поэтому я не могу добавить User Principal к методу

3. Что ж, тогда вам нужно создать новый метод, такой как @Query(value = "SELECT * FROM USERS u WHERE u.region in :#{principal.region}", countQuery = "SELECT count(*) FROM USERS WHERE u.region in :#{principal.region}", nativeQuery = true) Страница<Пользователь> findAllByRegion(Pageable var1, пользовательский принципал);

4. Возможно, я не понимаю ответа, но я не вижу, как это решило бы проблему, мне нужно использовать переопределенный метод findall для PagingAndSortingRepository, если я создам новый запрос, который не переопределяет существующий метод, тогда мне нужно будет переопределить существующий контроллер, созданный spring data rest, и создать свое собственное сопоставление для запроса get, а затем вызвать новый запрос.