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
相关产品推荐
相关产品推荐

