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

Spring Boot 3.1升级至3.2后Redis仍报Parameter无名称错误

Spring Boot 3.2升级后仍遇MappingException:参数无名称问题

错误栈

org.springframework.data.mapping.MappingException: Parameter org.springframework.data.mapping.Parameter@57ced0b5 does not have a name
at org.springframework.data.mapping.model.PersistentEntityParameterValueProvider.getParameterValue(PersistentEntityParameterValueProvider.java:61)
at org.springframework.data.mapping.model.ClassGeneratingEntityInstantiator.extractInvocationArguments(ClassGeneratingEntityInstantiator.java:301)
at org.springframework.data.mapping.model.ClassGeneratingEntityInstantiator$EntityInstantiatorAdapter.createInstance(ClassGeneratingEntityInstantiator.java:273)
at org.springframework.data.mapping.model.ClassGeneratingEntityInstantiator.createInstance(ClassGeneratingEntityInstantiator.java:98)
at org.springframework.data.redis.core.convert.MappingRedisConverter.doReadInternal(MappingRedisConverter.java:222)
at org.springframework.data.redis.core.convert.MappingRedisConverter.readInternal(MappingRedisConverter.java:180)
at org.springframework.data.redis.core.convert.MappingRedisConverter.readCollectionOrArray(MappingRedisConverter.java:818)
at org.springframework.data.redis.core.convert.MappingRedisConverter.readProperty(MappingRedisConverter.java:284)
at org.springframework.data.redis.core.convert.MappingRedisConverter$ConverterAwareParameterValueProvider.getPropertyValue(MappingRedisConverter.java:1092)
at org.springframework.data.redis.core.convert.MappingRedisConverter$ConverterAwareParameterValueProvider.getPropertyValue(MappingRedisConverter.java:1075)
at org.springframework.data.mapping.model.PersistentEntityParameterValueProvider.getParameterValue(PersistentEntityParameterValueProvider.java:71)
at org.springframework.data.mapping.model.ClassGeneratingEntityInstantiator.extractInvocationArguments(ClassGeneratingEntityInstantiator.java:301)
at org.springframework.data.mapping.model.ClassGeneratingEntityInstantiator$EntityInstantiatorAdapter.createInstance(ClassGeneratingEntityInstantiator.java:273)
at org.springframework.data.mapping.model.ClassGeneratingEntityInstantiator.createInstance(ClassGeneratingEntityInstantiator.java:98)
at org.springframework.data.redis.core.convert.MappingRedisConverter.doReadInternal(MappingRedisConverter.java:222)
at org.springframework.data.redis.core.convert.MappingRedisConverter.read(MappingRedisConverter.java:174)
at org.springframework.data.redis.core.convert.MappingRedisConverter.read(MappingRedisConverter.java:105)
at org.springframework.data.redis.core.RedisKeyValueAdapter.get(RedisKeyValueAdapter.java:290)
at org.springframework.data.redis.core.RedisKeyValueAdapter.getAllOf(RedisKeyValueAdapter.java:374)
at org.springframework.data.redis.core.RedisKeyValueAdapter.getAllOf(RedisKeyValueAdapter.java:341)
at org.springframework.data.keyvalue.core.KeyValueTemplate.lambda$findAll$2(KeyValueTemplate.java:216)
at org.springframework.data.keyvalue.core.KeyValueTemplate.execute(KeyValueTemplate.java:314)
at org.springframework.data.keyvalue.core.KeyValueTemplate.executeRequired(KeyValueTemplate.java:329)
at org.springframework.data.keyvalue.core.KeyValueTemplate.findAll(KeyValueTemplate.java:214)
at org.springframework.data.keyvalue.repository.support.SimpleKeyValueRepository.findAll(SimpleKeyValueRepository.java:108)
at org.springframework.data.keyvalue.repository.support.SimpleKeyValueRepository.findAll(SimpleKeyValueRepository.java:42)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:352)
at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277)
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170)
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158)
at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516)
at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168)
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:249)
at jdk.proxy3/jdk.proxy3.$Proxy157.findAll(Unknown Source)

解决方案

1. 彻底确认-parameters编译参数生效

  • Maven配置:确保maven-compiler-plugin同时开启compile和test阶段的参数保留:
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${maven-compiler-plugin.version}</version>
        <configuration>
            <parameters>true</parameters>
        </configuration>
        <executions>
            <execution>
                <id>default-compile</id>
                <phase>compile</phase>
                <goals>
                    <goal>compile</goal>
                </goals>
            </execution>
            <execution>
                <id>default-testCompile</id>
                <phase>test-compile</phase>
                <goals>
                    <goal>testCompile</goal>
                </goals>
                <configuration>
                    <parameters>true</parameters>
                </configuration>
            </execution>
        </executions>
    </plugin>
    
  • Gradle配置:给compileJava和compileTestJava任务都添加参数:
    tasks.withType(JavaCompile) {
        options.parameters = true
    }
    
  • 验证生效:反编译实体类的class文件,检查构造函数参数是否保留名称;或者通过代码测试:
    Constructor<?> constructor = YourEntity.class.getDeclaredConstructor(String.class, Integer.class);
    String[] paramNames = constructor.getParameterNames();
    // 如果能拿到具体名称,说明参数生效
    

2. 排查实体类构造函数问题

  • Lombok兼容:Spring Boot 3.2要求Lombok版本至少为1.18.30,建议直接使用Spring Boot管理的Lombok版本,避免版本不兼容导致参数名称丢失:
    <!-- Maven中直接引入,不用指定版本 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    
  • 内部类处理:如果实体类是内部类,必须声明为static,否则Spring Data无法正确解析参数名称。
  • 强制指定参数名:给构造函数参数添加@Param注解,绕过编译参数的依赖:
    public class YourEntity {
        private String name;
        private Integer age;
    
        public YourEntity(@Param("name") String name, @Param("age") Integer age) {
            this.name = name;
            this.age = age;
        }
    }
    

3. 清理构建与IDE缓存

  • 执行构建工具的清理命令:Maven执行mvn clean install,Gradle执行./gradlew clean build
  • 清理IDE缓存(比如IDEA:File -> Invalidate Caches...,勾选"Clear file system cache and local history"后重启),避免旧的class文件残留。

4. 检查Spring Data Redis配置

  • 确认没有自定义MappingRedisConverter或实体实例化器,覆盖了默认的参数名称解析逻辑;如果有自定义实现,确保兼容Spring Data 3.2的参数获取方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:34:58