2012-03-27 36 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; 

} 

そして、私は喜んように私のJPAオブジェクトにXMLを解析することができますこの:

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

しかし問題製品ごとに50以上のフィールドがあり、2つだけではありません。私は50 +節のif-else文を書くことができましたが、より良い選択肢のためにここでチェックする価値があると思いました!

XML要素名が直接製品クラスのプロパティ名に一致するように、私はこのようなものは完璧だろうと思った:

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

しかし、Javaはその表記が好きではありません。私はそれが似たような結果を達成するために何かできることがあるのでしょうか、それを吸い取ってif-else文を書く必要がありますか?

ご協力いただければ幸いです。

乾杯!

+0

受諾された回答は、当時の問題の最適な解決策でした。数ヶ月後には、示唆された図書館を試してみる価値があり、提案はすばらしかった。私は現在XStreamに移植しています。乾杯! –

答えて

3

反射(エラー処理なし)を使用する必要があります。

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

しかし、私はXStreamを提案した他の人たちです。これは、XMLファイルを解析するためのきれいな方法です。

+1

私はXStreamを使用してのポイントを取ると確かにそれを見ていますが、今のところ、私のXMLの解析が "適切な"ので、これは大きな助けになりましたありがとう。私がXMLに関係しない他の同様の問題に使用するのに十分な汎用性があるので、答えとして受け入れられました。 –

1

アウトBeanUtils.setProperty

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

+1

なぜか分からないけど、私の現在のセットアップでこれを動作させることができませんでした(Play!フレームワーク、JPAとHibernate)、とにかく感謝します。将来を考えています。 –

5

Javaは、XML処理のためにたくさんのフレームワークを知っています。 XMLとの間でオブジェクトをシリアライズ/デシリアライズするためのライブラリもあります。 JAXBをご覧になることをお勧めします。

+0

間違いなくそれを調べます、ありがとう!私のXML構文解析は、SAXとカスタムハンドラを使用して分単位で目的に合っていますが、最終的な調整(締め切りの締め切り!)を追加するだけでした。私は新鮮な、涼しい音が始まる次回JAXBを与えるだろう:) –

2

もう1つのオプションは、XStreamのようなものを使用して、xmlとのエンティティをシリアル化/デシリアライズすることです。

+0

私のJAXBのコメントと同じように、私はすべての解析をやり直す時間がありません(標準オブジェクトだけでなくJPAエンティティも扱っているので、私は特に慎重です)。しかし、ワークロードがやや緩やかになったら、XStreamにはうんざりしています。ご協力いただきありがとうございます! –

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とうまくやり合うことができるのか分かりません。とにかくありがとう :) –

0

あなたは非常によく知られているApache Commons Langを使用して、このような何かを行うことができます:

FieldUtils.writeField(myObject, fieldName, fieldValue); 
関連する問題