Репозиторий полей в ... NoteController требуется компонент типа ... NoteRepository, который не найден - PullRequest
0 голосов
/ 30 апреля 2019

Я пытался выполнить проект Spring, но всегда возвращает ошибку, я не знаю, является ли проблема версией Spring Boot.

У меня есть два проекта:

  • IntegrationCore (весенний загрузочный проект);
  • IntegrationModel (только для моделей);

Проект IntegrationCore содержит ссылки на проект IntegrationModel (Build Path -> Projects)

Когда я выполняю проект IntegrationCore (Запуск от имени -> Spring boot app), возвращает консольную ошибку:


ПРИЛОЖЕНИЕ НЕ УДАЛЕНО НА ЗАПУСК


Описание:

Для хранилища полей в com.integration.controller.NoteController требуется> bean-компонент типа 'com.integration.repository.NoteRepository', который не может быть> найден.Действие: рассмотрите возможность определения bean-компонента типа 'com.integration.repository.NoteRepository'> в вашей конфигурации.

Я попытался:

  • изменить версию загрузки Spring с1.5.7 до 1.5.20;
  • включает аннотацию mongoDb в классе Application;
  • вставляет аннотации для ссылок на пакеты IntegrationCore;

IntegrationCore

 src/
 ├── main/
 │   └── java/
 |       ├── com.integration/
 |       |   └── IntegrationCoreApplication.java
 |       ├── com.integration.controller/
 |       |   └── NoteController.java
 |       └── com.integration.repository/
 |           └── NoteRepository.java

IntegrationModel

 src/
 ├── main/
 │   └── java/
 |       ├── com.integrationModel/
 |       |   └── NoteStatuses.java
 |       └── com.integrationModel.filter/
 |           └── NoteStatusesParams.java

IntegrationCoreApplication.java

package com.integration;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages={
"com.integration", "com.integrationModel"})
public class IntegrationCoreApplication {

    public static void main(String[] args) {
        SpringApplication.run(IntegrationCoreApplication.class, args);
    }

}

NoteController.java

package com.integration.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.integrationModel.NoteStatuses;
import com.integrationModel.filter.NoteStatusesParams;
import com.integration.repository.NoteRepository;

@Component
@RestController
@RequestMapping(value = "/services/nota")
public class NoteController {

    @Autowired
    private NoteRepository repository;

    @RequestMapping(value = "/getStatuses", method = RequestMethod.POST)
    @ResponseBody
    public List<NoteStatuses> getStatuses(@RequestBody List<NoteStatusesParams> params) {
        return repository.findStatuses(params);
    }

}

NoteRepository.java

package com.integration.repository;

import java.util.List;

import org.springframework.stereotype.Service;

import com.integrationModel.NoteStatuses;
import com.integrationModel.filter.NoteStatusesParams;

@Service
public interface NoteRepository {
    List<NoteStatuses> findStatuses(List<NoteStatusesParams> param);
}

NoteStatusesParams.java

package com.integrationModel.filter;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Singular;

import java.util.List;

@Getter
@Builder(builderClassName = "Builder")
@NoArgsConstructor
@AllArgsConstructor
public class NoteStatusesParams {
    @Singular
    private List<String> orderNumbers;
    private String providerCpfCnpj;
    private String noteNumber;
}

NoteStatuses.java

package com.integrationModel;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Date;

@Data
@EqualsAndHashCode(of = {"id"})
public class NoteStatuses {

    private Boolean physicalReceipt;
    ...
}

Ответы [ 3 ]

0 голосов
/ 30 апреля 2019

Если вы используете NoteRepository в качестве репозитория, то лучше использовать @Repository, а не @ Service.

@SpringBootApplication
public class IntegrationCoreApplication {
    public static void main(String[] args) {
        SpringApplication.run(IntegrationCoreApplication.class, args);
    }

Аннотация @ SpringBootApplication эквивалентна использованию @Configuration, @EnableAutoConfiguration и @ComponentScan с их атрибутами по умолчанию. И разница между использованием 3 аннотаций и 1 @SpringBootApplication заключается в том, что с этими

@Configuration
@EnableAutoConfiguration
@Import({ ABC.class, XYZ.class }) 

@ Аннотируемые компонентом классы не обнаруживаются автоматически, а определяемые пользователем bean-компоненты импортируются явно (см. @Import).

0 голосов
/ 30 апреля 2019

Проблема в том, что вы помещаете аннотацию @Service в интерфейс, но не будет реализации этого интерфейса, которую Spring сможет внедрить по типу. У вас есть две возможности:

  1. Вам следует расширить один из Spring Data интерфейсов репозитория и позволить Spring создать для вас реализацию. Предполагая, что NoteEntity является сущностью и имеет идентификатор типа Long, это будет выглядеть следующим образом:
@Repository
public interface NoteRepository extends JpaRepository<NoteEntity, Long>{
}

Это пример использования JpaRepository . Кроме того, вам придется добавить @EnableJpaRepositories(basePackages = {"com.integration.repository"}) в свой класс IntegrationCoreApplication, чтобы Spring мог сканировать репозитории и создавать для вас реализацию. Конечно, можно определить больше методов, но вам придется использовать spring-data-jpa имена конкретных методов.

  1. Создайте собственную реализацию этого репозитория и добавьте к ней аннотации любого стереотипа, например @Component или даже @Repository, поскольку он также является компонентом.
0 голосов
/ 30 апреля 2019

Проблема с вашим следующим определением.

@Service
public interface NoteRepository {
    List<NoteStatuses> findStatuses(List<NoteStatusesParams> param);
}

Это интерфейс, и вы не можете определить это как Сервис, используя @Service.Spring попытается создать экземпляр для этого bean-компонента, и из-за этого происходит сбой.

Вам необходимо определить это как репозиторий, используя аннотацию @Repostiry и расширяя свой соответствующий репозиторий, например, репозиторий JPA или ElasticSearch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...