亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Spring Data Rest 中處理自定義 POST PUT 和 PATCH

在 Spring Data Rest 中處理自定義 POST PUT 和 PATCH

墨色風雨 2024-01-05 16:45:01
我有一個要求,其中我必須在 POST、PATCH 和 PUT 端點中具有自定義業務邏輯。不可能使用 SDR 事件,因為我需要在請求中執行一些事務操作。因此,我決定為通過服務類附加到存儲庫的實體創建自定義端點。@RepositoryRestController@RequestMapping("/myEntity")@ExposesResourceFor(MyEntity.class)public class MyEntityResource {    @PostMapping(value = "", produces = MediaTypes.HAL_JSON_VALUE)    public ResponseEntity postResult(@RequestBody Entity entity) {        // my logic    }}現在我面臨一個問題,我的 POST 請求可以具有到其他實體的關聯鏈接。SDR 的默認實現可以很好地處理這個問題,但我遇到了 Jackson 映射錯誤。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的實現方式,發現了以下方法@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)我發現,PersistentEntityResource payload填充了獲取的關聯實體,并且主要實體通過對存儲庫的正常保存調用進行保存。因此,我嘗試了自動裝配,PersistentEntityResource但本質上失敗了,因為調用者PersistentEntityResource期望映射 url 的形式/{repository}/<optional id>,并且我已經知道我的路徑是什么,PersistentEntityResource因此無法初始化。它也沒有幫助,它PersistentEntityResource不是通用的(它達到了 SDR 2.0.0.M1,之后被刪除)。能夠使用也PersistentEntityResource會使 PATCH 和 PUT 的實現變得更加容易。有什么辦法可以處理這個問題嗎?
查看完整描述

1 回答

?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

經過一番挖掘后我找到了答案。事后看來,這是非常微不足道的。只需在方法參數中使用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()

    }

}

您可以使用獲取實體本身entity.getContent()


查看完整回答
反對 回復 2024-01-05
  • 1 回答
  • 0 關注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號