使用ReactiveCrudRepository查询返回全属性为null的对象问题求助
以下是几个常见原因及对应的解决办法:
1. 数据库字段与实体类属性名映射不匹配
如果你的数据库表字段使用下划线命名(如author_id、first_name),而实体类用驼峰命名(authorId、firstName),R2DBC默认不会自动进行驼峰与下划线的转换,导致字段无法映射,最终返回属性全为null的对象。
解决方法:
- 方法一:在配置文件中开启全局驼峰转下划线映射
在application.properties或application.yml中添加配置:spring.r2dbc.convert-naming-style=SNAKE_CASE - 方法二:给实体类属性添加
@Column注解指定对应数据库字段名
修改Author实体类:@Table("Author") @Data @AllArgsConstructor @NoArgsConstructor public class Author { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column("author_id") private Long authorId; @Column("first_name") private String firstName; @Column("last_name") private String lastName; @Column("national_code") private String nationalCode; }
2. 实体类@Table注解的表名与实际数据库表名不符
数据库表名可能存在大小写敏感问题(如PostgreSQL区分大小写,MySQL默认不区分但如果表名创建时加了引号则区分),如果@Table("Author")的表名和数据库中实际表名不一致,会导致查询空结果,最终返回null对象。
解决方法:
确认数据库中的实际表名,修改@Table注解的参数,比如数据库表名为author(小写),则改为:
@Table("author")
3. Reactive流的订阅方式不当
你的服务类中直接调用了xxxxx.subscribe(s->System.out.println(s)),这会创建一个独立的订阅者消费流,虽然你返回了原Flux,但这种做法可能导致流的处理出现异常(不过这通常不会导致属性全为null,但会影响返回结果的正确性)。
解决方法:
使用doOnNext替代subscribe来打印日志,这样不会额外消费流:
public Flux<Author> GetAllAuthor() { return authorRepository.findAll() .doOnNext(s -> System.out.println(s)); }
4. 缺失R2DBC相关依赖或配置错误
如果项目中没有正确引入R2DBC的依赖,或者数据库连接配置错误,会导致查询无法正确执行,返回空的流,最终表现为null对象(或空列表)。
解决方法:
- 检查
pom.xml(Maven)或build.gradle(Gradle)中是否包含R2DBC starter和对应数据库驱动:
Maven示例:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-r2dbc</artifactId> </dependency> <dependency> <groupId>dev.miku</groupId> <artifactId>r2dbc-mysql</artifactId> <scope>runtime</scope> </dependency> - 确认
application.properties中的数据库连接配置正确:spring.r2dbc.url=r2dbc:mysql://localhost:3306/your_database_name spring.r2dbc.username=your_username spring.r2dbc.password=your_password
内容的提问来源于stack exchange,提问作者sina heidari
相关产品推荐
相关产品推荐

