【问题标题】:Spring Boot + MongoDB Id querySpring Boot + MongoDB Id 查询
【发布时间】: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


【解决方案1】:

嗯,我自己找到了答案。切换回小写 id 以便 findById 工作并将以下类添加到项目中:

@Configuration
public class SpringDataRestConfiguration extends RepositoryRestConfigurerAdapter  {

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.exposeIdsFor(Resource.class);
    }
}

正如方法名称所暗示的,此配置使 Resource 类对象在 JSON 中公开其 id。

UPDATE:如果你使用的是最新版或者相对最新版本的spring-boot,RepositoryRestConfigurerAdapter类已经被弃用,java-doc建议直接使用接口RepositoryRestConfigurer

所以你的代码应该是这样的:

@Configuration
public class SpringDataRestConfiguration implements RepositoryRestConfigurer  
...

【讨论】:

    猜你喜欢
    • 2019-10-05
    • 2019-07-07
    • 2021-11-21
    • 2017-01-06
    • 2018-04-26
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    相关资源
    最近更新 更多