@Autowired не внедряет репозиторий Mongodb или службу -nullPointerException- - PullRequest
0 голосов
/ 18 апреля 2020

Я использую хранилище mongodb, подключенное к службе, и хочу подключить его к другому компоненту, чтобы я мог использовать findAll.

@Service
@Transactional
public class SettingService implements SettingInterface {

  public SettingService() {
  }

  private SettingRepository settingRepository;

  @Autowired
  public SettingService(SettingRepository settingRepository) {
    this.settingRepository = settingRepository;
  }

  @Override
  public List<Setting> findAll() {
    return settingRepository.findAll();
  }
}

Репозиторий

public interface SettingRepository extends MongoRepository<Setting, String> {
}

Класс, который я хочу чтобы ввести мои данные в

@Component
public class Config {

    private  SettingService service;

    public Config() {
    }

    @Autowired
    public Config(SettingService service) {
        this.service = service;
    }

// The doSomething method is being called from a constructor 

  public Order(List<Item> listOfItems) {
    // Initialize ArrayLists
    order = new ArrayList<>();
    results = new ArrayList<>();
    possibleResults = new ArrayList<>();
    Accepted = new HashMap<>();


    doSomething();

    // Soft copy order
    order.addAll(listOfItems);
  }


    @Transactional
    public void doSomething() {
        List<Setting> settingList = service.findAll();
        // Manipulate Data


  }
}

проблема, с которой я сталкиваюсь, заключается в том, что внедрение службы возвращает ноль, я запустил приложение в режиме отладки и установил точку останова, где я вызываю findAll, он вызывает исключение nullPointerException, службу не был введен.

Я также попытался автоматически подключить репозиторий прямо в мой конфигурационный класс вместо службы, но те же результаты nullPointerException

PS: та же конфигурация с той же инъекцией службы, кажется, прекрасно работает в одном из мои контроллеры, сервис успешно подключен, но он не работает с моим @Component. Также пытался использовать @Service, @Transactiona, но результаты те же.

  • Spring boot Version 2.2.4.RELEASE
  • Mongodb: 3.11.2

РЕДАКТИРОВАТЬ: Также пытался автоматически подключить хранилище, как это:

    @Repository
    public interface SettingRepository extends MongoRepository<Setting, String> {
    }

Мой класс компонентов

// tried it with @Component as well 
@Service
@Transactional
public class Config {

    private SettingRepository SettingRepository;

    @Autowired
    public Config(SettingRepository SettingRepository) {
        this.SettingRepository = SettingRepository;
    }

    public Config() {
    }


    public Config(List<Item> listOfItems) {
        // Initialize ArrayLists
        order = new ArrayList<>();
        possibleConfigurations = new ArrayList<>();
        acceptedConfigurations = new ArrayList<>();
        mapOfAcceptedConfigurations = new HashMap<>();

        doSomething();

        // Soft copy order
        order.addAll(listOfItems);
    }

   public void doSomething() {
        List<Setting> settingList = SettingRepository.findAll();

        Level securityLevel = settingList.get(0).getSecurityLevel();
        Level fragileAndHeavyLevel =settingList.get(0).getLevelFragileItem();

    }

это произвело то же самое, мне интересно, если иметь несколько конструкторы могут привести к тому, что автопроводка будет нулевой. Я автоматически подключаю только один конструктор, который вводит репо

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Мы можем использовать @Component в приложении, чтобы пометить компоненты как управляемые компоненты Spring. Spring только принимает и регистрирует bean-компоненты с помощью @Component и вообще не ищет @Service и @Repository.

Таким образом, вы не можете автоматически связывать @Service и @Repository в компоненте, если не указан порядок сканирования компонентов .

Используйте @Configuration вместо @Component, если вы хотите выполнить автоматическое подключение и использовать @Repository в классе репозитория.

0 голосов
/ 19 апреля 2020

РЕШЕНИЕ ОБНОВЛЕНИЯ:

Я нашел источник проблемы, я вызываю doSomething из этого конструктора

public Config(List<Item> listOfItems) {
    // Initialize ArrayLists
    order = new ArrayList<>();
    possibleConfigurations = new ArrayList<>();
    acceptedConfigurations = new ArrayList<>();
    mapOfAcceptedConfigurations = new HashMap<>();

    doSomething();

    // Soft copy order
    order.addAll(listOfItems);
}

Метод doSomething извлекает данные из хранилища но конструктор не внедряет его, скорее, я использовал другой конструктор для autoWire, который в этом случае будет возвращать nullPointerException, поэтому мое исправление состояло в том, чтобы переместить вызов doSomething в конструктор, где я автоматически связал его с

@Autowired
public Config(SettingRepository settingRepository) {
    this.settingRepository = settingRepository;

    doSomething();

}
...