簡體   English   中英

如何讓Spring 3.2的ConversionService和HttpMessageConverters一起為@RequestBody注釋工作?

[英]How to get Spring 3.2's ConversionService and HttpMessageConverters to work together for @RequestBody annotation?

在AJAX流行之前,可以通過使用自定義屬性編輯器並將其注冊到控制器中來在ID和實體之間進行轉換。 因此,如果您有一個包含CompanyUser表單支持對象,如果company.id為5,Spring將調用您的自定義屬性編輯器,以便您可以獲取ID為5的Company並將其設置為user.company屬性。

現在,在Ajax的處理方式中,我們有類似的要求。 而不是使用表單支持對象,我們希望對User對象進行HTTP POST或PUT作為JSON數據,並讓Spring代表我們自動將JSON轉換為User對象。 Spring通過@RequestBody批注以及使用Jackson來回將JSON編組到Java對象中,使這成為可能。

這只是一個虛構的例子。 想象一個User其中包含一個帶有適當的獲取器/設置器的Company對象。

@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void create(@Valid @RequestBody User user) {
    userService.saveUser(user);
}

由於就Spring而言,屬性編輯器已成為過去,所以我們應該使用新的Conversion Service API。 對於我的應用程序,我已經成功創建了一個工廠,該工廠可以執行以前的舊屬性編輯器所做的工作-將id轉換回實體。

我的問題是,在Jackson封送JSON數據期間或之后,如何讓Spring調用轉換服務? 我知道可以創建一個自定義JsonDeserializer ,但是我發現編寫/測試它們是一個痛苦而漫長的過程,因為我需要對大量實體進行此操作,每個反序列化器將花費60到200行每個編碼。

如果Spring可以代表我為我做id到實體的映射,就像表單支持對象那樣,我會很喜歡。 有辦法嗎?

在這種情況下,它將僅適用於根對象User ,而不適用於嵌套組件。 Spring Data REST有一個`DomainClassConverter',您可以看一下。

基本上,您想創建ConditionalGenericConverter來檢查它是否可以轉換請求的對象(即EntityManager / SessionFactory是否可以加載它)。 (非條件版本在這里

這與REST(基本上)在服務器端進行查找有些矛盾,因為您應該發送請求所需的所有內容(代表性狀態傳輸和超媒體作為所有狀態的傳輸引擎)。 但這是另一個討論:)。

鏈接

  1. 域實體轉換器博客
  2. 彈簧參考指南

Deinum先生的回答很好。 但是對於實際工作,請考慮一下AOP;)在您的問題中使用它可能會很有趣:)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM