2012-03-27 70 views
2

我對Java相對較新,希望對此有所幫助!Java/JPA - 在對象/實體上動態設置屬性

我有十足的產品的XML文件是這樣的:

<product> 
    <title>Product Title</title> 
    <colour>Red</colour> 
</product> 

而且我有一個JPA實體是這樣的:

@Entity 
public Product extends Model { 

    public String title; 
    public String colour; 

} 

而且我可以高興地解析XML到像我JPA對象這樣的:

public void parseElement(String elementName, String elementValue) { 
    if (elementName == "title") { 
     product.title = elementValue; 
    } 
    else if (elementName == "colour") { 
     product.colour = elementValue; 
    } 
} 

然而問題每個產品有超過50個字段,而不僅僅是兩個字段。我可以寫一個50+的子句if-else語句,但是認爲在這裏首先要檢查更好的選擇是值得的!

由於XML元素名稱直接匹配到Product類的屬性名稱,我想這樣的事情將是完美的:

public void parseElement(String elementName, String elementValue) { 
    product[elementName] = elementValue; 
} 

但Java沒有這樣的符號。還有什麼我可以做的,會達到類似的結果,還是我必須吸了起來,寫一個拼寫if-else語句?

任何幫助將不勝感激。

乾杯!

+0

接受的答案是當時問題的絕佳解決方案。幾個月後,有人要求我們花費大量時間嘗試建議的庫,這些變化非常棒 - 感謝您的建議。我現在正在移植到XStream。乾杯! – 2012-07-18 08:54:48

回答

3

您必須使用反射(錯誤處理ommitted)。

product.getClass().getDeclaredField(elementName).set(product, elementValue); 

但是我支持其他建議了XStream的人。這是解析XML文件的更簡潔的方法。

+1

我重點介紹了使用XStream,並且會明確地研究它,但是現在,因爲我的XML解析是「足夠的」,這幫了我一大筆錢謝謝。授予它作爲接受的答案,因爲它足夠通用,可供我用於與XML無關的其他類似問題。 – 2012-03-27 16:05:20

1

結帳BeanUtils.setProperty

http://commons.apache.org/beanutils/

+1

我不知道爲什麼,但我無法得到這與我目前的設置(Play!框架,JPA和Hibernate),但無論如何,謝謝。將繼續銘記未來。 – 2012-03-27 16:09:02

5

知道Java的XML處理了很多框架。還有一些用於序列化/從xml反序列化對象的庫。我建議看看JAXB

+0

肯定會看到它,謝謝!正如我在另一評論中所說的那樣,儘管我的XML解析在一分鐘內適合用途(使用SAX和自定義處理程序),所以只是想添加最後的調整(緊迫的最後期限!)。下次我開始新鮮的時候會給JAXB一個旋風,聽起來很酷:) – 2012-03-27 16:11:57

2

另一種選擇是使用類似XStream的東西來序列化/反序列化您的實體與xml。

+0

與我的JAXB評論一樣,我沒有時間重新做所有的解析(我特別謹慎,因爲我正在處理JPA實體,而不僅僅是標準對象)。但是,一旦工作量減輕一點,我肯定會給XStream一個旋風。謝謝你的幫助! – 2012-03-27 16:13:39

0

嗯,也許不是最好的解決辦法,但你也可以簡單地使用地圖:

public Product extends Model { 
    public Map<String,String> myMap = new HashMap<String,String>(); 
} 

和:

public void parseElement(String elementName, String elementValue) { 
    product.myMap.put(elementName,elementValue); 
} 
+0

是的,我也想到了這一點,但我不知道如何才能讓它與JPA很好地搭配。不管怎麼說,還是要謝謝你 :) – 2012-03-27 16:14:04

0

你可以使用非常著名的Apache Commons Lang,然後做這樣的事情:

FieldUtils.writeField(myObject, fieldName, fieldValue);