Я получаю сообщение об ошибке. Параметру 0 конструктора потребовался один компонент, но 2 были найдены, но один из "найденных" компонентов был удален мной - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь настроить базу данных h2, используя jpa / jdbc, после создания реализации для интерфейса запроса, использующего jpa, в отличие от jdbc, я теперь получаю ошибку:

Параметр 0 конструктора в com. nsa.charitystarter.service.CharityQueries требовал одного компонента, но были найдены 2: - charityRepoJDBC: определено в файле [C: \ Users \ V La Roche \ Desktop \valuation-1-starter \ out \ production \ classes \ com \ nsa\ charitystarter \ data \ CharityRepoJDBC.class] - charityRepoJPA: определено в null

Я не уверен в том, что пошло не так, и я не совсем уверен, куда идти, я не смог найти много людей спохожая проблема для меня онлайн.

Моя реализация с использованием jdbc

@Repository
public class CharityRepoJDBC implements CharityRepository {

    private JdbcTemplate jdbc;
    private RowMapper<Charity> charityMapper;

    @Autowired
    public CharityRepoJDBC(JdbcTemplate aTemplate) {
        jdbc = aTemplate;


        charityMapper = (rs, i) -> new Charity(
                rs.getLong("id"),
                rs.getString("name"),
                rs.getString("registration_id"),
                rs.getString("acronym"),
                rs.getString("purpose")
        );
    }

    @Override
    public List<Charity> findCharityBySearch(String searchTerm) {

        String likeSearch = "%" + searchTerm + "%";

        return jdbc.query(
                "select id, acronym, name, purpose, logo_file_name, registration_id  " +
                        "from charity " +
                        "where concat(name, acronym, purpose, registration_id) like ?",
                new Object[]{likeSearch},
                charityMapper);
    }

    @Override
    public Optional<Charity> findById(Long id) {
        return Optional.of(
                jdbc.queryForObject(
                        "select id, acronym, name, purpose, logo_file_name, registration_id  from charity where id=?",
                        new Object[]{id},
                        charityMapper)
        );
    }
}

Реализация Charity Finder:

@Service
public class CharityQueries implements CharityFinder {
    private CharityRepository charityRepository;


    public CharityQueries(CharityRepository repo) {
        charityRepository = repo;
    }

    public Optional<Charity> findCharityByIndex(Integer index) {
        return charityRepository.findById(index.longValue());
    }

    public List<Charity> findCharityBySearch(String searchTerm) {

        return charityRepository.findCharityBySearch(searchTerm);
    }
}

Интерфейс CharityFinder

public interface CharityFinder {

    public Optional<Charity> findCharityByIndex(Integer index);

    public List<Charity> findCharityBySearch(String searchTerm);

}

ошибкажурнал:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.nsa.charitystarter.service.CharityQueries required a single bean, but 2 were found:
    - charityRepoJDBC: defined in file [C:\Users\V La Roche\Desktop\assessment-1-starter\out\production\classes\com\nsa\charitystarter\data\CharityRepoJDBC.class]
    - charityRepoJPA: defined in null


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed


Process finished with exit code 0

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Похоже, у вас есть стартер JDBC Spring на пути к классам и стартер JPA Spring Data.

В Spring Data JDBC есть ошибка , из-за которой он создает реализацию даже для интерфейсов репозитория. в противном случае вы получите одну реализацию из JPA, а другую - из JDBC.

Если вы действительно хотите использовать Spring Data JDBC и Spring Data JPA, вы можете ограничить значения @EnableJdbcRepositories и * 1008. * аннотации с использованием фильтров включения и исключения.

Но из вашего кода и тегов, которые вы использовали, я подозреваю, что вас совсем не интересует Spring Data Jdbc, а только Spring Jdbc. Если это так, найдите зависимость spring-boot-starter-data-jdbc и измените ее на spring-boot-starter-jdbc.

В случае, если все эти Spring (Data) JDBC / JPA сбивают вас с толку, этот вопрос и его ответы могут помочь: Spring Data JDBC / Spring Data JPA против Hibernate

0 голосов
/ 03 ноября 2019

В настоящее время у вас есть следующее определение:

@Repository
public class CharityRepoJDBC implements CharityRepository {

И вы вводите CharityRepository в свой уровень обслуживания CharityQueries

@Service
public class CharityQueries implements CharityFinder {
    private CharityRepository charityRepository;

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

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

  1. CharityRepository сам по себе и другие
  2. CharityRepoJDBC

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

Таким образом, вы можете попробовать добавить квалификаторы, как показано ниже, для решения проблемы.

@Service
    public class CharityQueries implements CharityFinder {
        @Qualifier("CharityRepoJDBC")
        private CharityRepository charityRepository;

и в то же время изменить ваш CharityRepoJDBC на

@Repository(value = "CharityRepoJDBC")
public class CharityRepoJDBC implements CharityRepository {
...