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

Spring Boot+MongoDB项目中_id属性引发PropertyReferenceException求助

解决Spring Boot + MongoDB中_id属性引发的PropertyReferenceException问题

我帮你分析下这个问题的根源并给出具体的解决方案:

问题根源

Spring Data MongoDB的查询方法解析器会遵循JavaBean规范解析方法名,而_id这种带下划线的属性名,会被解析器误判为命名分隔符(比如把findBy_Id拆成findBy + Id),导致找不到对应的Id属性,从而抛出PropertyReferenceException。但你手动实现的RepositoryImpl查询能在MongoDB正常执行,是因为直接使用了MongoDB原生字段名,绕开了Spring Data的方法解析逻辑。

解决方案

这里有两种可靠的解决方式,你可以根据需求选择:

1. 用@Field注解映射字段(推荐)

这种方式既符合Java命名规范,又能正确映射MongoDB的_id字段,彻底解决异常和查询问题:

  • 修改Payment实体类,将属性名改为符合Java规范的id,同时用@Field("_id")指定映射到MongoDB的_id字段:
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.annotation.Id; // 结合Spring Data主键注解使用更规范

public class Payment {
    @Id
    @Field("_id")
    private String id; // 类型可根据实际存储调整为ObjectId等

    // 其他属性、getter和setter方法
}
  • 之后在PaymentRepository中使用id定义查询方法,比如Payment findById(String id);,Spring Data就能正确解析方法名,查询时会自动映射到MongoDB的_id字段,完美解决问题。

2. 自定义@Query注解绕过方法解析(适合必须保留_id属性名的场景)

如果因为特殊需求必须保留Java属性名为_id,可以直接用@Query注解写原生MongoDB查询,绕开Spring Data的方法名解析逻辑:

import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface PaymentRepository extends MongoRepository<Payment, String> {
    @Query("{ '_id': ?0 }")
    Payment findByCustomId(String id); // 方法名可自定义,只要@Query内字段正确即可
}

这样就能直接执行目标查询,不会触发PropertyReferenceException,同时保留_id属性名。

额外注意点

如果坚持使用_id作为Java属性名,一定要确保对应的getter/setter是get_id()和set_id(),而非getId()/setId()——不过这种方式不符合JavaBean规范,会给后续开发带来潜在问题,因此优先推荐第一种方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:40:21