Как получить только одну роль из набора ролей - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь реализовать простой весенний проект безопасности, где в основном у меня есть сущности пользователя и роли. У меня есть набор ролей «АДМИН» и «ПОЛЬЗОВАТЕЛЬ».

Теперь я хочу назначить только роль «ПОЛЬЗОВАТЕЛЬ» вместе с созданием нового пользователя.

Я пытался использовать Список и коллекции с той же проблемой.

Сущность пользователя имеет Set<Role>

public class User {

    @Id
    @Column(name = "user_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int user_id;

    @NotNull
    @Column(name = "user_name", unique = true)
    private String userName;

    @NotNull
    @Column(name = "first_name")
    private String firstName;

    @NotNull
    @Column(name = "last_name")
    private String lastName;

    @Column(name = "roles")
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles;}

А Роль сущности:

public class Role {

    }
    @Id
    private int role_id;
    private String role;

}

А вот и метод saveMyUser для сохранения пользователя в моей базе данных. Когда я использую:

public void saveMyUser(User user) {
    Set<Role> hash_Set = new HashSet<Role>();
    user.setPassword(encoder().encode(user.getPassword()));
        user.setRoles(new HashSet<>(roleRepository.findAll())); <--- Here
        userRepository.save(user);
    }

user.setRoles(new HashSet<>(roleRepository.findAll())); назначить все роли пользователю, поскольку я хочу, чтобы для нового пользователя была назначена только роль «ПОЛЬЗОВАТЕЛЬ».

Я попытался user.setRoles(new HashSet<>(roleRepository.findByRole(2)));, а также попытался user.setRoles(new HashSet<>(roleRepository.findByID(2))); с этой ошибкой: Невозможно определить аргументы типа для HashSet <>.

Таблица ролей в моей базе данных:

role_id    role
1          ADMIN
2          USER

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Конструктор HashSet принимает Collection, а не один элемент.Эта строка:

user.setRoles(new HashSet<>(roleRepository.findAll()));

создает новый HashSet со всеми вашими ролями.Эта строка

user.setRoles(new HashSet<>(roleRepository.findByRole(2)));

пытается создать новый HashSet с одним элементом в конструкторе, который не будет работать, поскольку роль не является экземпляром Collection.

Просто выберите свою роль, создайте HashSet, добавьте роль и затем установите роль пользователя:

Role role = roleRepository.findByRole(2);
Set<Role> roles = new HashSet<>();
roles.add(role);
user.setRoles(roles);
0 голосов
/ 15 апреля 2019

Если вы используете репозиторий Spring Data, то одной из проблем является то, что выбранные вами имена / типы параметров не соответствуют вашей сущности.Нет поля с именем "ID", и тип role равен String, а не int.

. Лучше всего сделать подпись метода репозитория

Role findByRole(String roleName);
* 1008.* Вам также следует изменить имя и тип данных идентификатора в вашем Role объекте - по соглашению Java использует camelCase, а не snake_case, и хотя int, вероятно, подходит для такой таблицы, как ROLE, которая, как правило, остается небольшой, в общем случаена случай, если вам понадобится большее пространство клавиш, которое дает long.Также лучше иметь согласованный тип данных для ваших идентификаторов по вашим объектам - это избавляет вас от необходимости думать «подождите, это был int или long?».Это должно быть private long roleId;.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...