Несколько шаблонов Micronaut JDB C не работают - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь написать функцию микронавта, которая развертывается как AWS Lambda.

С моей функцией micronaut мне нужно подключиться к нескольким базам данных, получить данные и поместить данные в AWS SQS. В связи с этим я пытаюсь использовать шаблонный подход JDB C для получения данных из разных источников данных. Но я получаю сообщение об ошибке: Обнаружено несколько возможных кандидатов в bean-компоненты: [org.springframework.jdb c .core.JdbcTemplate, org.springframework.jdb c .core.JdbcTemplate, org.springframework.jdb c .core.JdbcTemplate] ошибка

package io.test.invoice;

import io.micronaut.context.annotation.Factory;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.inject.Named;
import javax.inject.Singleton;
import javax.sql.DataSource;

@Factory
public class JdbcTemplateFactory {

    @Singleton
    JdbcTemplate jdbcTemplateOne(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Singleton
    JdbcTemplate jdbcTemplateTwo(@Named(value = "database2") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}
package io.test.invoice;

import io.micronaut.context.annotation.Requires;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.inject.Singleton;
import java.util.List;

@Singleton
@Requires(beans = JdbcTemplate.class)
public class CodeSetRepository {
    private final JdbcTemplate jdbcTemplateOne;
    private final JdbcTemplate jdbcTemplateTwo;

    public CodeSetRepository(JdbcTemplate jdbcTemplateOne, JdbcTemplate jdbcTemplateTwo) {
        this.jdbcTemplateOne = jdbcTemplateOne;
        this.jdbcTemplateTwo = jdbcTemplateTwo;
    }

    public List<CodeSet> getAllCodeSets() {
        String SELECT_QUERY = "SELECT * FROM public.code_set";
        return this.jdbcTemplateTwo.query(SELECT_QUERY, new BeanPropertyRowMapper(CodeSet.class));
    }

    public List<Country> getAllCountries() {
        String SELECT_QUERY = "SELECT * FROM public.country";
        return this.jdbcTemplateOne.query(SELECT_QUERY, new BeanPropertyRowMapper(Country.class));
    }
}

Может ли кто-нибудь помочь с этим, пожалуйста?

1 Ответ

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

Название параметра jdbcTemplateOne не имеет отношения к впрыску. Таким образом, оба параметра запрашивают одно и то же. Существует несколько шаблонов, поэтому Micronaut не знает, какой из них внедрить.

На вашей фабрике вы можете создать шаблон для каждого источника данных с помощью

@EachBean(DataSource.class)
JdbcTemplate jdbcTemplateOne(DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

Тогда именованный квалификатор источника данных будет перенести в шаблон. Это означает, что в вашем примере вы можете внедрить @Named("database2") JdbcTemplate jdbcTemplate.

В качестве альтернативы вы можете добавить квалификаторы @Named к фабричным методам, а затем внедрить шаблоны jdb c с этими квалификаторами.

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