我有一个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中的目录名?
我从来没有收到关于为什么我必须指定 "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()