Как можно упростить postConstruct() что бы был один Set?

@Component
public class UserInit {

    private final UserService userService;
    private final PasswordEncoder passwordEncoder;

    public UserInit(UserService userService, PasswordEncoder passwordEncoder) {
        this.userService = userService;
        this.passwordEncoder = passwordEncoder;
    }

    @PostConstruct
    private void postConstruct() {
        List<User> users = userService.getAllUsers();

        if (users.isEmpty()) {
            Role admin = new Role("ROLE_ADMIN");
            Role user = new Role("ROLE_USER");
            Set<Role> adminRole = new HashSet<>();
            Set<Role> userRole = new HashSet<>();
            Set<Role> anyRole = new HashSet<>();
            adminRole.add(admin);
            userRole.add(user);
            anyRole.add(admin);
            anyRole.add(user);
            userService.createUser(new User("admin",
                passwordEncoder.encode("admin"),
                "Admin", (byte) 30, "[email protected]", adminRole));
            userService.createUser(new User("user",
                passwordEncoder.encode("user"),
                "User", (byte) 20, "[email protected]", userRole));

        }
    }
}

Ответы (1 шт):

Автор решения: Михаил Ребров

Если Вам нужны унивальные наборы ролей, то проще будет совсем избежать создания временных переменных

Set<Role> adminRole = new HashSet<>();
Set<Role> userRole = new HashSet<>();
Set<Role> anyRole = new HashSet<>();

А передавать в метод создания пользователя инициализованный в одну строку набор ролей


Примеры инициализации Set

Можно передать в конструктор список, созданный "на лету" с помощью утилитарного класса Arrays

new HashSet<>(Arrays.asList(admin, user))

Java 8. Streams
В 8ой версии можно воспользоваться стримами

Stream.of(admin, user).collect(Collectors.toCollection(HashSet::new))

Java 9
В 9ой версии можно воспользоваться методом of() с помощью которого можно инициализировать Set
В результате вы получите немодифицируемый набор

Set.of(admin, user)

Java 10. Streams
В 10ой версии можно воспользоваться стримами для получения немодифицируемого набора

Stream.of(admin, user).collect(Collectors.toUnmodifiableSet())

Итог

Ну и в коде получится так:
(использовал дефолтную версию, т.к. не знаю какая у вас версия Java, можете заменить на то, что вам больше нравится...у себя бы я для 9ой версии использовал)

@Component
public class UserInit {

    private final UserService userService;
    private final PasswordEncoder passwordEncoder;

    public UserInit(UserService userService, PasswordEncoder passwordEncoder) {
        this.userService = userService;
        this.passwordEncoder = passwordEncoder;
    }

    @PostConstruct
    private void postConstruct() {
        List<User> users = userService.getAllUsers();

        if (users.isEmpty()) {
            Role admin = new Role("ROLE_ADMIN");
            Role user = new Role("ROLE_USER");

            userService.createUser(new User("admin",
                passwordEncoder.encode("admin"),
                "Admin", (byte) 30, "[email protected]", new HashSet<>(Arrays.asList(admin))));
            userService.createUser(new User("user",
                passwordEncoder.encode("user"),
                "User", (byte) 20, "[email protected]", new HashSet<>(Arrays.asList(user))));
        }
    }
}
→ Ссылка