2015-03-31 64 views
0

該場景很簡單: UI調用RESTful API來獲取對象樹,然後UI更改一些數據並調用RESTful API來更新它。在RESTful API中合併兩個Java bean的最佳方式是什麼?

但是出於安全或性能方面的原因...,我的RESTful API無法將整個對象樹引入UI。

我們有兩種選擇:爲RESTful API創建單獨的Java Bean,或者擴展現有的商業Java Bean和@JsonIgnore。

第二個看起來更聰明,因爲我們重新使用商務艙。

但現在我們遇到了麻煩:我需要將UI中的對象與DB中的對象合併,否則我會丟失一些數據。

但是我怎麼知道哪一段數據會來自UI? 我知道我可以硬編碼一個一個地複製字段。 但這種方式很危險。

我在尋求通用的方法來避免硬代碼複製字段。

我嘗試了org.apache.commons.beanutils.BeanUtils,但它不能滿足要求,因爲它總是覆蓋目標字段。

所以我這樣想:
如果UI bean中的字段不是Null,那麼覆蓋目標bean中同名字段的值。但如果字段是某種像int這樣的默認值爲0的基本類型,我該如何處理? 我不知道該字段是否真的帶有UI值0,或者不是從UI返回。

我試圖將原始類型轉換爲對象類型,但它仍然有布爾類型的問題,許多java工具不支持「Boolean isValid(){...}」像BeanUtils。這種轉換在現有的代碼中是危險的。

我想這些代碼:

JacksonAnnotationIntrospector ai = new JacksonAnnotationIntrospector(); 
AnnotatedClass ac = AnnotatedClass.construct(MyClassDTO.class, ai, null); 
    String[] ignoredList = ai.findPropertiesToIgnore(ac);  
    for(String one: ignoredList){ 
     System.out.println(one); 
    } 

但ignoredList總是空。我正在使用傑克遜1.9.2

+0

你能與反思這樣做?像讀取你的ui-bean中的所有字段並將它們傳送到數據庫bean?你能舉一個簡單的例子嗎? – Ria 2015-03-31 17:05:00

+0

到Ria:我知道如何以通用的方式合併java bean,但我需要知道哪些字段來自UI。 – Justin 2015-03-31 17:22:08

+0

好了,現在我明白了。只是一些頭腦風暴:添加一個列表到傳遞的對象,其中包含用戶更改的字段名稱? – Ria 2015-03-31 17:29:28

回答

0

你可以考慮使用JsonPatch。我們使用它,它工作得很好。當然,這意味着你在JSON級別上應用補丁,而不是直接在bean上應用補丁,所以如果你需要支持的不僅僅是JSON,它可能是一個問題。

下面是一個實現:https://github.com/fge/json-patch

0

我發現了傑克遜的解決方案:

MyBean defaults = objectMapper.readValue(defaultJson, MyBean.class); 
ObjectReader updater = objectMapper.readerForUpdating(defaults); 
MyBean merged = updater.readValue(overridesJson); 

它來自:

readerForUpdating

merging on Jackson

相關問題