【问题标题】:Micronaut multiple JDBC templates not workingMicronaut 多个 JDBC 模板不起作用
【发布时间】:2020-02-17 05:57:19
【问题描述】:

我正在尝试编写一个部署为 AWS Lambda 的 micronaut 函数。

使用我的 micronaut 功能,我需要连接到多个数据库并获取数据并将详细信息放入 AWS SQS。在这方面,我正在尝试使用 JDBC 模板方法从不同的数据源获取数据。但我收到错误:找到多个可能的 bean 候选者:[org.springframework.jdbc.core.JdbcTemplate, org.springframework.jdbc.core.JdbcTemplate, org.springframework.jdbc.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));
    }
}

有人可以帮忙吗?

【问题讨论】:

    标签: jdbctemplate micronaut micronaut-data


    【解决方案1】:

    参数名称jdbcTemplateOne 与注入无关。所以这两个参数都要求同样的事情。有多个模板,因此 Micronaut 不知道要注入哪一个。

    在您的工厂中,您可以为每个数据源创建一个模板

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

    然后数据源的命名限定符将转移到模板。这意味着在您的示例中,您可以注入 @Named("database2") JdbcTemplate jdbcTemplate

    或者,您可以将 @Named 限定符添加到工厂方法中,然后使用这些限定符注入 jdbc 模板。

    【讨论】:

      【解决方案2】:

      如下更改您的存储库构造函数

         @Inject
         public CodeSetRepository(@Named("database2") JdbcTemplate jdbcTemplateOne) {
              this.jdbcTemplateOne = jdbcTemplateOne;
         }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        相关资源
        最近更新 更多