@AuthenticationPrincipal UserModel user всегда Null. Испробовал много методов решения!

Есть контроллер, задача которого по REST API вернуть мне профайл пользователя. Код далее:

@PostMapping("/me")
public UserProfileResponse getUserProfile(@AuthenticationPrincipal UserAuthenticationPrincipalModel user ) {
    return userProfileService.getUserProfile(user.getUserId());
}

Я создал модель для сущности User. Класс-сущность создан, как:

public class User implements UserDetails { ... }

Модель имеет следующую структуру:

public class UserAuthenticationPrincipalModel extends User {
    private String userId;
    private String avatarUrl;

    public UserAuthenticationPrincipalModel(***.********.entity.User user) {
        super(user.getUsername(), user.getPassword(), user.isEnabled(), user.isAccountNonExpired(),
                user.isCredentialsNonExpired(), user.isAccountNonLocked(), user.getAuthorities());
        this.userId = user.getUserId();
        this.avatarUrl = user.getUserPic();
    }
// + equals and hashCode
}

В модели данные, которые я буду когда-либо (или пока что так планирую) подтягивать из Принципала авторизированного пользователя. Согласно ТЗ не могу использовать дефолтный Принципал, даже не пробовал его. Реализация (имплементация) UserDetailsService:

@Service
public class UserDetailsServiceImpl extends AbstractMySQLService<User, String, UserRepository> implements UserDetailsService {
    private final UserRepository userRepository;

    public UserDetailsServiceImpl(final UserRepository userRepository, final UserRepository repository) {
        super(repository);
        this.userRepository = userRepository;
    }

    @Override
    public UserAuthenticationPrincipalModel loadUserByUsername(final String email) {
        User user = userRepository.findByEmail(email);

        if (user == null) {
            throw new UsernameNotFoundException("Invalid username or user not e: " + email);
        }

        return new UserAuthenticationPrincipalModel(user);
    }
}

Ошибка: В методы всегда прилетает null, генерирует NPE при любом "геттере". Сделал множество дополнений, которые рекомендуются на Баелданге и англоязычном стэке - ничего :(


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

Автор решения: zolt

Попробуйте в контроллере использовать объект Authentication auth. Именно его Spring нормально инжектит в методы контроллеров. В нём есть ссылка на org.springframework.security.core.userdetails.UserDetails, которым должна быть Ваша реализция.

→ Ссылка