Spring @Autowired не работает в некоторых классах

Итак, я использую Spring для доступа к моей БД и выборки пользователей на основе разных свойств. С помощью @Restcontroller я получаю данные. Я создал UserRepository, который расширяет CrudRepository.

import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<User, Integer> {
Iterable<User> findByNachname(String nachname);

    Iterable<User> findByRolle(Rolle rolle);

    Optional<User> findByBenutzername(String benutzername);

    @Transactional
    String deleteByBenutzername(String benutzername);
}

Я использую @Autowire для получения экземпляра UserRepo в моем классе Controller.

@RestController
public class LoginController {
    @Autowired
    private UserRepository userRepository;
}

Это отлично работает во всех контроллерах, которые у меня есть. Но теперь, когда я пытаюсь сделать то же самое в другом классе, экземпляр userRepository имеет значение null.

public class Authentificator {
    @Autowired
    private UserRepository userRepository;
}

Authentificator и LoginController не находятся в одном пакете. Но оба они не находятся в том же пакете, что и UserRepo.

  • project
    • UserRepo-package
    • Пакет контроллера
    • Аутентификатор-пакет

person Funny Crafter    schedule 23.11.2018    source источник
comment
Кажется, Authentificator не является компонентом Spring. Это? Как получить его экземпляр? Spring только автоматически связывает зависимости в bean-компонентах Spring, которые должны быть созданы Spring.   -  person JB Nizet    schedule 23.11.2018


Ответы (3)


вы должны убедиться, что Authentificator также является компонентом spring - я имею в виду, что вы должны аннотировать его чем-то вроде @Component или @Service. После этого шага вам также нужно будет «получить» экземпляр Authentificator из Spring вместо того, чтобы создавать его с помощью ключевого слова new.

person adrhc    schedule 23.11.2018
comment
После избавления от получения Authentificator путем создания его экземпляра с помощью new теперь он работает отлично. - person Funny Crafter; 23.11.2018
comment
о, тогда так :) - person adrhc; 23.11.2018

@Autowired работает только с контекстом spring. Это означает, что он будет работать только с экземплярами классов, которыми управляет Spring. Ваш класс Authentificator управляется вами, и Spring не должен заботиться или знать об этом, это не важно для Java Framework.

Это скорее проблема конфигурации, а не проблема аннотаций.

person Abhishek Anand    schedule 23.11.2018

Если вы хотите, чтобы Spring внедрил поле в объект Authenticator, зависимый объект также должен быть создан Spring. Вы можете сделать это, пометив этот класс как @Component или создав метод с типом возвращаемого значения Authenticator, помеченным аннотацией @Bean. Затем его нужно куда-то впрыснуть.

person piotrpo    schedule 23.11.2018