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

