Spring 6迁移遇JDBC错误:无法确定调用签名及参数名称缺失
Spring 6/Spring Boot 3迁移中的JDBC与参数名称问题解决方案
问题背景
项目从Spring 5/Spring Boot 2迁移至Spring 6/Spring Boot 3,使用mssql-jdbc 6.4.0.jre8版本,运行时出现两个错误:
错误1:SimpleJdbcCall无法识别存储过程签名
执行代码:
SimpleJdbcCall procedure = new SimpleJdbcCall(namedJdbcTemplate.getJdbcTemplate()) .withProcedureName(procedureName).returningResultSet(QueryParameterConstants.P_RESULTSET, rowMapper); procedure.compile();
抛出异常:
org.springframework.dao.InvalidDataAccessApiUsageException: Unable to determine the correct call signature - no procedure/function/signature for 'getUsersRole' at org.springframework.jdbc.core.metadata.GenericCallMetaDataProvider.processProcedureColumns(GenericCallMetaDataProvider.java:365) ~[spring-jdbc-6.1.3.jar:6.1.3] at org.springframework.jdbc.core.metadata.GenericCallMetaDataProvider.initializeWithProcedureColumnMetaData(GenericCallMetaDataProvider.java:119) ~[spring-jdbc-6.1.3.jar:6.1.3] at org.springframework.jdbc.core.metadata.CallMetaDataProviderFactory.lambda$createMetaDataProvider$0(CallMetaDataProviderFactory.java:133) ~[spring-jdbc-6.1.3.jar:6.1.3] at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:354) ~[spring-jdbc-6.1.3.jar:6.1.3] at org.springframework.jdbc.core.metadata.CallMetaDataProviderFactory.createMetaDataProvider(CallMetaDataProviderFactory.java:89) ~[spring-jdbc-6.1.3.jar:6.1.3]
错误2:参数名称反射识别失败
执行代码:
paramMap.put(USER_ID, userId);//userId为Integer类型
抛出异常:
java.lang.IllegalArgumentException: Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag. at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.updateNamedValueInfo(AbstractNamedValueMethodArgumentResolver.java:185) ~[spring-web-6.1.3.jar:6.1.3]
要求:不修改现有业务代码,提供解决方法。
解决方案
针对错误1:升级mssql-jdbc驱动版本
Spring 6/Spring Boot 3对JDBC驱动的元数据解析逻辑做了调整,旧版本mssql-jdbc 6.4.0.jre8无法兼容该逻辑。直接升级到适配JRE8的最新稳定版(如12.4.0.jre8及以上)即可解决存储过程签名识别问题,无需修改代码。
Maven项目修改依赖示例:
<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>12.4.0.jre8</version> </dependency>
针对错误2:启用兼容配置或编译器参数
Spring 6默认严格要求保留参数名称元数据,可通过以下两种方式解决,均无需修改业务代码:
- 添加编译器
-parameters参数:让编译器保留参数名称信息,供Spring反射使用- Maven项目配置示例:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <compilerArgs> <arg>-parameters</arg> </compilerArgs> </configuration> </plugin> - Gradle项目配置示例:
compileJava { options.compilerArgs << '-parameters' }
- Maven项目配置示例:
- 启用Spring MVC参数兼容模式:回退到Spring 5的参数名称解析逻辑
- application.properties配置:
spring.mvc.method.parameters.enabled=false - application.yml配置:
spring: mvc: method: parameters: enabled: false
- application.properties配置:
内容的提问来源于stack exchange,提问作者Nidhi257
相关产品推荐
相关产品推荐

