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 в моем классе контроллера.

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

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

public class Authentificator {
    @Autowired
    private UserRepository userRepository;
}

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

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

Кажется, что Authenticator - это не компонент Spring. Это? Как получить его экземпляр? Spring только автоматически подключает зависимости в Spring beans, которые должны быть созданы Spring.

JB Nizet 23.11.2018 20:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
1
6 285
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

После избавления от получения Authentificator путем создания его экземпляра с помощью новый теперь он работает отлично.

Funny Crafter 23.11.2018 20:26

ах, вот и все :)

adrhc 23.11.2018 20:27

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

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

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

Другие вопросы по теме