【发布时间】:2018-07-27 11:46:54
【问题描述】:
我不想默认公开我的存储库,看起来RepositoryRestConfiguration.disableDefaultExposure() 完全符合我的要求;但是我在调用/{respository/{id} 时收到 405 响应。
我已将存储库中的所有方法标记为已公开,据我所知,除FindById 外,所有其他方法都可以正常工作。
@RepositoryRestResource(exported = true)
interface MyEntityRepository : PagingAndSortingRepository<MyEntity, Int> {
@RestResource(exported = true)
override fun findAll(sort: Sort): MutableIterable<MyEntity>
@RestResource(exported = true)
override fun findAll(pageable: Pageable): Page<MyEntity>
@RestResource(exported = true)
override fun <S : MyEntity?> save(entity: S): S
@RestResource(exported = true)
override fun findAll(): MutableIterable<MyEntity>
@RestResource(exported = true)
override fun deleteById(id: Int)
@RestResource(exported = true)
override fun deleteAll(entities: MutableIterable<MyEntity>)
@RestResource(exported = true)
override fun deleteAll()
@RestResource(exported = true)
override fun <S : MyEntity?> saveAll(entities: MutableIterable<S>): MutableIterable<S>
@RestResource(exported = true)
override fun count(): Long
@RestResource(exported = true)
override fun findAllById(ids: MutableIterable<Int>): MutableIterable<MyEntity>
@RestResource(exported = true)
override fun delete(entity: MyEntity)
@RestResource(exported = true)
override fun existsById(id: Int): Boolean
@RestResource(exported = true)
override fun findById(id: Int): Optional<MyEntity>
}
@Component
class SpringDataRestCustomization() : RepositoryRestConfigurerAdapter() {
override fun configureRepositoryRestConfiguration(config: RepositoryRestConfiguration?) {
config!!.disableDefaultExposure()
}
}
结果:
GET /myentities/1
cache-control: no-cache
postman-token: 3d310c2e-2e1c-4587-880d-cc2f79cbb9eb
user-agent: PostmanRuntime/7.2.0
accept: */*
host: localhost:8080
accept-encoding: gzip, deflate
HTTP/1.1 405
status: 405
allow: PUT,PATCH,DELETE,OPTIONS
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
cache-control: no-cache, no-store, max-age=0, must-revalidate
pragma: no-cache
expires: 0
x-frame-options: DENY
content-length: 0
date: Fri, 27 Jul 2018 11:42:25 GMT
使用 Spring Boot 并将 spring-data-releasetrain.version 设置为 Kay-SR9。
是否有我错过的方法或我需要做的其他事情来允许 GET?我没有此(或任何)存储库的控制器。
--- 编辑---
经过一番摸索后,我想我找到了原因,但我不太喜欢我的解决方案;当 Spring 正在寻找 findById 方法时,它正在寻找 java.lang.Integer 类型的参数,但我的方法被定义为原始 int; Kotlin 将 ID 类型参数设置为 java.lang.Integer,但将函数参数设置为 int,因此它们不匹配。
按以下方式更新我的存储库类但会导致 Warning:(13, 67) Kotlin: This class shouldn't be used in Kotlin. Use kotlin.Int instead.:
@RepositoryRestResource(exported = true)
interface MyEntityRepository : PagingAndSortingRepository<MyEntity, java.lang.Integer> {
...
@RestResource(exported = true)
override fun findById(id: java.lang.Integer): Optional<MyEntity>
}
--- 编辑 2 ---
我目前正在使用下面的代码;但是 Kotlin 认为我的方法不会覆盖继承的方法(如果我在其中添加 overrides 关键字,它将无法编译)。
@RepositoryRestResource(exported = true)
interface MyEntityRepository : PagingAndSortingRepository<MyEntity, Int?> {
...
@RestResource(exported = true)
fun findById(id: Int?): Optional<MyEntity>
}
【问题讨论】:
-
谢谢!!我的日子过得好吗!
标签: java spring kotlin spring-data-jpa spring-data-rest