Ваш UserService неправильно внедрен и, следовательно, неправильно инициализирован, что приводит к исключению нулевого указателя. Ниже приведены некоторые действия, которые вы можете сделать:
В вашем фильтре JWTAuthorization вставьте службу пользователя:
public class JWTAuthorizationFilter extends BasicAuthenticationFilter {
private final IUserService UserService; // create IUserService as below
public JWTAuthorizationFilter(AuthenticationManager authManager, IUserService userService) {
super(authManager);
this.userService = userService;
}
(...)
}
Удалить UserService userService = new UserService (); из вашего метода getAuthentication, потому что у вас уже есть экземпляр userService, введенный через конструктор.
В вашем классе WebSecurity (или любом другом классе, реализующем WebSecurityConfigurerAdapter) сделайте то же самое, внедрив IUserService:
private final IUserService userService;
public WebSecurity(IUserService userService)
{
this.userService = userService;
}
В том же классе (WebSecurity) вы переопределяете метод configure, добавляя JWTAuthorizationFilter. Теперь вам нужно передать userService.
.addFilter(new JWTAuthorizationFilter(authenticationManager(), userService))
Наконец, создайте интерфейс IUserService
public interface IUserService{
ApplicationUser getByUsername(String username);
}
Измените свой UserService для реализации IUserService (удалите @Component, потому что на самом деле это @Service).
@Service
public class UserService implements IUserService{
// keep it as is
}
Примечание: вы можете назвать свой интерфейс как UserService, а конкретную реализацию как UserServiceImpl, потому что вы всегда будете использовать интерфейс, а не конкретную реализацию, поэтому он лучше читается.
Бонус: разница между аннотациями @Component и @Service https://www.baeldung.com/spring-component-repository-service