在MongoDB支持的Spring Data REST存储库中使用自定义ID



我正在使用Spring和MongoDB进行一个新项目。这两方面我都是新手,所以请耐心等待,我找不到这个问题的确切答案。

我使用的是spring-boot-starter-data-rest,有一个像这样的存储库:

@RepositoryRestResource(collectionResourceRel = "widget", path = "widget")
interface WidgetRepository : MongoRepository<Widget, ObjectId> {
fun findByType(@Param("type") type: String): List<Widget>
}

对于这样的实体:

data class Widget @JsonCreator constructor(@JsonProperty val type: String) {
@Id
lateinit var id: ObjectId
}

这会使用Mongo文档ID:自动为您提供一个CRUD API

GET /widget/{mongo doc id}
GET /widget/search/findByType?type=
POST /widget
PUT /widget
PATCH /widget

但我不想使用Mongo文档ID。我想引入一个辅助标识符,并在API中的所有地方使用它。这是因为;小部件";是物理世界中带有条形码的项目,我们不想在条形码中打印Mongo文档ID。

显然,我们可以使用SpringREST API工具来实现这一点,例如

@GetMapping("/widget/{barcode}/")
fun getByBarcode(@PathVariable barcode: String): Widget {
return widgetRepository.findByBarcode(barcode)
}

等等。。但是有没有什么聪明的方法可以让@RepositoryRestResource用自定义ID为我们构建其automagic API?也许通过以这样一种方式实现CrudRepository<Widget, Barcode>,我们必须包装一个MongoRepository<Widget, ObjectId>?我对Spring在引擎盖下的工作方式还不够熟悉,不知道这样的事情是否可能发生。

提前感谢

我想您正在寻找EntityLookup:

SPI可自定义实体的哪个属性用作唯一标识符,以及如何从后端查找实体实例。

首先,如果我犯了任何错误,我不使用Kotlin编程-您需要在您的实体中包括barcode属性:

data class Widget @JsonCreator constructor(@JsonProperty val type: String, @JsonProperty val barcode: String) {
@Id
lateinit var id: ObjectId
}

然后,修改您的存储库并定义一种新方法,该方法将提供给定条形码的Widget

@RepositoryRestResource(collectionResourceRel = "widget", path = "widget")
interface WidgetRepository : MongoRepository<Widget, ObjectId> {
fun findByBarcode(@Param("barcode") barcode: String): Optional<Widget>
fun findByType(@Param("type") type: String): List<Widget>
}

最后,配置一个RestRepositoryConfigurer,并通过EntityLookupRegistrar:注册EntityLookup

@Component
class RestRepositoryConfigurator : RepositoryRestConfigurer {
override fun configureRepositoryRestConfiguration(config: RepositoryRestConfiguration) {
config.withEntityLookup()
.forRepository(WidgetRepository::class.java)
.withIdMapping(Widget::barcode)
.withLookup(WidgetRepository::findByBarcode)
}
}

如果您需要更多信息,请查看Spring Data Rest文档的15.1部分。

最新更新