You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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默认严格要求保留参数名称元数据,可通过以下两种方式解决,均无需修改业务代码:

  1. 添加编译器-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'
      }
      
  2. 启用Spring MVC参数兼容模式:回退到Spring 5的参数名称解析逻辑
    • application.properties配置:
      spring.mvc.method.parameters.enabled=false
      
    • application.yml配置:
      spring:
        mvc:
          method:
            parameters:
              enabled: false
      

内容的提问来源于stack exchange,提问作者Nidhi257

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 00:03:18