Не удается сохранить объект с полем GrantedAuthority (создатели, такие как конструкция по умолчанию, не существуют) - PullRequest
1 голос
/ 16 марта 2020

Я пытался включить регистрацию пользователей на основе форм в моем проекте.

Просто регистрация пользователя без ролей работает нормально, однако добавление некоторых ролей приводит к ошибке:

com.faster xml .jackson.databind.ex c. InvalidDefinitionException: невозможно создать экземпляр org.springframework.security.core.GrantedAuthority (создатели, такие как конструкция по умолчанию, не существуют): абстрактные типы либо должны быть сопоставлены с конкретными типами, либо иметь собственный десериализатор, либо содержать дополнительную информацию о типе в [Source: (PushbackInputStream); строка: 9, столбец: 21] (через цепочку ссылок: com.warehousing.model.User ["полномочия"] -> java .util.HashSet [0])

Я подозреваю, что проблема заключается в том, что Spring не знает, как преобразовать мое авторитетное представление во что-то, что расширяет GrantedAuthority. При этом я попытался переключиться с GrantedAuthority на SimpleGrantedAuthority, но проблема осталась.

Мой Пользовательский класс выглядит следующим образом:

public class User implements UserDetails {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String fName;
    private String lName;
    private String phone;
    private String email;

    // Properties for Spring authentication

    @ElementCollection(targetClass=SimpleGrantedAuthority.class, fetch = FetchType.EAGER)
    @JsonDeserialize(as = SimpleGrantedAuthority.class)
    private Set<? extends GrantedAuthority> grantedAuthorities;
    @NotNull
    private String password;
    @NotNull
    private String username;
    private boolean isAccountNonExpired;
    private boolean isAccountNonLocked;
    private boolean isCredentialsNonExpired;
    private boolean isEnabled;

    public User(String fName, String lName, String phone, String email, 
                Set<SimpleGrantedAuthority> grantedAuthorities, String password, String username, 
                boolean isAccountNonExpired, boolean isAccountNonLocked, 
                boolean isCredentialsNonExpired, boolean isEnabled) {       
        this.fName = fName;
        this.lName = lName;
        this.phone = phone;
        this.email = email;
        this.grantedAuthorities = grantedAuthorities;
        this.password = password;
        this.username = username;
        this.isAccountNonExpired = isAccountNonExpired;
        this.isAccountNonLocked = isAccountNonLocked;
        this.isCredentialsNonExpired = isCredentialsNonExpired;
        this.isEnabled = isEnabled;
    }
    // Getters, setters & constructors
}

Мой UserController метод создания нового пользователя:

@RestController
public class UserController {
    @Autowired
    UserService userService;

    @PostMapping("/users")
    public User createNew(@Valid @RequestBody User user) {
        return userService.addUser(user);
    }
}

Который вызывает UserService :

public class UserService implements UserDetailsService {

    @Autowired
    UserRepository userRepo;

    public User addUser(User user) {

        Set<SimpleGrantedAuthority> userRoles = user.getGrantedAuthorities()
                .stream()
                .map(p -> new SimpleGrantedAuthority(p.getAuthority()))
                .collect(Collectors.toSet());

        User newUser = new User(user.getfName(), user.getlName(), 
                user.getPhone(), user.getEmail(), 
                userRoles, 
                user.getPassword(), user.getUsername(), 
                user.isAccountNonExpired(), 
                user.isAccountNonLocked(), 
                user.isCredentialsNonExpired(), 
                user.isEnabled());

        return userRepo.save(newUser);
    }
}

Теперь, отправка JSON выглядит следующим образом:

{
    "fName": "First",
    "lName": "Last",
    "phone": "+3111111111",
    "email": "test@mail.com",
    "password": "password",
    "username": "user",
    "enabled": true,
    "authorities": [],
    "accountNonLocked": true,
    "accountNonExpired": true,
    "credentialsNonExpired": true
}

Однако добавление некоторого вида власти вызовет ошибку, упомянутую выше:

{
    "fName": "First",
    "lName": "Last",
    "phone": "+3111111111",
    "email": "test@mail.com",
    "password": "password",
    "username": "user",
    "enabled": true,
    "authorities": [{
            "authority": "inventory:read"
        }],
   "accountNonLocked": true,
    "accountNonExpired": true,
    "credentialsNonExpired": true
}

Любая помощь приветствуется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...