墨色風(fēng)雨
2024-01-05 16:45:01
我有一個(gè)要求,其中我必須在 POST、PATCH 和 PUT 端點(diǎn)中具有自定義業(yè)務(wù)邏輯。不可能使用 SDR 事件,因?yàn)槲倚枰谡?qǐng)求中執(zhí)行一些事務(wù)操作。因此,我決定為通過服務(wù)類附加到存儲(chǔ)庫的實(shí)體創(chuàng)建自定義端點(diǎn)。@RepositoryRestController@RequestMapping("/myEntity")@ExposesResourceFor(MyEntity.class)public class MyEntityResource { @PostMapping(value = "", produces = MediaTypes.HAL_JSON_VALUE) public ResponseEntity postResult(@RequestBody Entity entity) { // my logic }}現(xiàn)在我面臨一個(gè)問題,我的 POST 請(qǐng)求可以具有到其他實(shí)體的關(guān)聯(lián)鏈接。SDR 的默認(rèn)實(shí)現(xiàn)可以很好地處理這個(gè)問題,但我遇到了 Jackson 映射錯(cuò)誤。JSON parse error: Cannot construct instance of `com.foo.bar.Entity` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('/api/v1/entity/12345678-1234-1234-1234-123456789012')于是我查了一下Spring的實(shí)現(xiàn)方式,發(fā)現(xiàn)了以下方法@ResponseBody@RequestMapping(value = BASE_MAPPING, method = RequestMethod.POST)public ResponseEntity<ResourceSupport> postCollectionResource(RootResourceInformation resourceInformation, PersistentEntityResource payload, PersistentEntityResourceAssembler assembler, @RequestHeader(value = ACCEPT_HEADER, required = false) String acceptHeader)我發(fā)現(xiàn),PersistentEntityResource payload填充了獲取的關(guān)聯(lián)實(shí)體,并且主要實(shí)體通過對(duì)存儲(chǔ)庫的正常保存調(diào)用進(jìn)行保存。因此,我嘗試了自動(dòng)裝配,PersistentEntityResource但本質(zhì)上失敗了,因?yàn)檎{(diào)用者PersistentEntityResource期望映射 url 的形式/{repository}/<optional id>,并且我已經(jīng)知道我的路徑是什么,PersistentEntityResource因此無法初始化。它也沒有幫助,它PersistentEntityResource不是通用的(它達(dá)到了 SDR 2.0.0.M1,之后被刪除)。能夠使用也PersistentEntityResource會(huì)使 PATCH 和 PUT 的實(shí)現(xiàn)變得更加容易。有什么辦法可以處理這個(gè)問題嗎?
1 回答

人到中年有點(diǎn)甜
TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊
經(jīng)過一番挖掘后我找到了答案。事后看來,這是非常微不足道的。只需在方法參數(shù)中使用Resource<Entity>代替即可。Entity
@RepositoryRestController
@RequestMapping("/myEntity")
@ExposesResourceFor(MyEntity.class)
public class MyEntityResource {
@PostMapping(value = "", produces = MediaTypes.HAL_JSON_VALUE)
public ResponseEntity postResult(@RequestBody Resource<Entity> entity) {
// my logic. Fetch the entity with entity.getContent()
}
}
您可以使用獲取實(shí)體本身entity.getContent()
添加回答
舉報(bào)
0/150
提交
取消