【发布时间】:2018-01-26 14:34:06
【问题描述】:
我有一个结合 MongoDB 作为持久层的 Spring Boot 应用程序。我有以下结构:
public class Resource {
@Id
public String Id;
...
}
我也有一个 ResourceRepository:
@RepositoryRestResource(collectionResourceRel = "resources", path = "resources")
public interface ResourceRepository extends MongoRepository<Resource, String> {
Resource findById(@Param("Id")String Id);
}
我在网上发现,当您执行http://localhost:8080/resources/ 之类的 GET 请求时,在 JSON 中返回 id 属性的一种方法是将 id 属性更改为 Id(大写 i)。事实上,如果属性是小写的,我就不会得到一个 id 字段,但是如果我把它改成大写,我就会得到它。出于某种原因,我需要取回 id 属性,所以我使用了大写的 i。到目前为止,一切顺利。
但是,当我尝试执行存储库中包含的查询 findById 时,出现异常:
org.springframework.data.mapping.context.InvalidPersistentPropertyPath: No property id found on app.model.Resource!
如果我将 Id 属性更改为 id(小写 i),我可以成功执行 /resources/search/findById?id=... GET 请求。
我尝试使用一个查询创建一个自定义控制器,该查询根据给定的 id 查找并返回一个资源:
@Controller
@RequestMapping("/resource")
public class ResourceController {
@Autowired
MongoOperations mongoOperations;
@RequestMapping(value="/findById/{resourceId}/", method= RequestMethod.GET)
@ResponseBody
public Resource findByResourceId(@PathVariable("resourceId") String resourceId) {
Resource resource = mongoOperations.findOne(query(Criteria.where("Id").is(resourceId)), Resource.class,"DOJ");
}
}
但我收到同样的错误:
org.springframework.data.mapping.context.InvalidPersistentPropertyPath: No property id found on app.model.Resource!
关于如何在 JSON 中显示 id 属性并能够 findById 的任何想法?
【问题讨论】:
-
看看报错spring data is not able to find property with name id (small i)。您的属性是 Id(大写字母 I)。 Sprint 数据存储库按惯例工作,并正在寻找名称为 id(小 i)的属性。
-
谢谢@rangalo,我明白这一点,但我的问题不是我为什么会收到错误,而是如何公开 id 并能够使用 id 进行查询。
-
按照约定将字段 ID 更改为 id,字段名称以小写字母开头。如果您不想这样做或不能这样做,那么您将不得不使用自定义存储库而不是 spring 数据存储库。
标签: java spring mongodb spring-boot