Spring Boot JdbcTemplate 无法确定正确的调用签名--多个过程函数签名。

问题描述 投票:0回答:1

我有一个Spring Boot应用程序,它使用JdbcTemplate来调用一个存储过程,名为 up_RefData_getParticipantBitCrossINTERN.

当应用程序调用存储过程时,会抛出以下异常。

org.springframework.dao.InvalidDataAccessApiUsageException。无法确定正确的调用签名 多重程序、功能、签名 对于 'up_RefData_getParticipantBitCrossINTERN'。:发现[aquadev2.null.up_RefData_getParticipantBitCrossINTERN, 水溶胶.null.up_RefData_getParticipantBitCrossINTERN]。

我的数据库是MySql 5.x.x,它包含两个目录。(Aquadev2和Aquaprod) 两者都包含了相同的存储过程,JdbcTemplate甚至不应该知道aquaprod目录,因为我在application.properties中特别说明了连接哪个目录。

JdbcTemplate甚至不应该知道aquaprod目录,因为我在application.properties中特别说明了要连接到哪个目录。

spring.datasource.url=jdbc:mysql://<hostname>:3306/aquadev2?serverTimezone=America/New_York

如果我在java代码中硬编码我想要的目录,

SimpleJdbcCall getBitCrossInternal = new SimpleJdbcCall(jdbcTemplate)
        .withProcedureName(STORED_PROC_INTERN).withCatalogName("aquadev2");

它工作得很好,但这是不可接受的硬编码目录名称。

为什么JdbcTemplate不能识别数据源URL中的目录名?

spring-boot jdbctemplate
1个回答
0
投票

我从来没有收到关于为什么我必须指定 "catalog "的答案,但我确实设法避免了硬编码,而满足于在application.properties中指定目录。

在application.properties.中创建一个名为Datasource的类。

refdataserver.datasource.catalog=${DB}

在包com.XXX.refdataserver中创建一个名为Datasource的类 确保你有目录的getter和setter以及@ConfigurationProperties注解。

@Configuration
@ConfigurationProperties(prefix = "refdataserver.datasource")
@Validated
@Getter
@Setter
@ToString
public class Datasource {
   /**
    * Must specify the database in applicaton.properties
    */
   @NotNull(message = "refdataserver.datasource.catalog is mandatory")
   private String catalog;
}

用Datasource的实例创建一个属性持有者Configuration。

@Component("serverProps")
@Configuration
@ConfigurationProperties(prefix = "refdataserver")
@Validated
@Getter
@Setter
@ToString
public class RefDataServerProperties {
   /** refdataserver.datasource properties */
   private Datasource dataSource;
}

然后,在任何一个类中通过autowire,你可以通过属性配置来检索目录。

@Autowired
private RefDataServerProperties serverProps;
...
serverProps.getDataSource().getCatalog()
© www.soinside.com 2019 - 2024. All rights reserved.