2012-03-27 17 views
2

Ich bin relativ neu in Java und würde jede Hilfe zu diesem Thema schätzen!Java/JPA - Eigenschaften für ein Objekt/Entity dynamisch festlegen

Ich habe eine XML-Datei voll von Produkten wie folgt aus:

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

Und ich habe eine JPA Entity wie folgt aus:

@Entity 
public Product extends Model { 

    public String title; 
    public String colour; 

} 

Und ich kann glücklich die XML in mein JPA Objekt analysieren wie dies:

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

jedoch das Problem ist, dass es mehr als 50 Felder pro Produkt gibt, nicht nur die zwei. Ich könnte eine if-else-Anweisung mit einer 50+ Klausel schreiben, dachte mir aber, dass es sich lohnt, hier zuerst nach besseren Alternativen zu suchen!

Da die XML-Elementnamen zu den Eigenschaftsnamen in der Produktklasse direkt anzeigen lassen, dachte ich so etwas wie dies wäre perfekt:

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

Aber Java funktioniert nicht wie diese Notation. Gibt es noch etwas, was ich tun könnte, um ein ähnliches Ergebnis zu erzielen, oder muss ich es aufheben und eine Kollisions-If-Else-Anweisung schreiben?

Jede Hilfe würde sehr geschätzt werden.

Prost!

+0

Akzeptierte Antwort war große Lösung für Problem zu der Zeit. Monate später wurde eine ganze Reihe von Änderungen verlangt, die es wert waren, die Zeit damit zu verbringen, die vorgeschlagenen Bibliotheken auszuprobieren und sie waren großartig - danke für die Vorschläge. Ich arbeite jetzt an der Portierung zu XStream. Prost! –

Antwort

3

Sie müssen Reflektion verwenden (Fehlerbehandlung wird ausgelassen).

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

Aber ich stehe zu anderen, die XStream vorgeschlagen haben. Es ist eine viel sauberere Möglichkeit zum Parsen von XML-Dateien.

+1

Ich nehme den Punkt, XStream zu benutzen und werde definitiv darauf achten, aber jetzt, da meine XML-Analyse "angemessen" ist, hat mir das sehr geholfen Vielen Dank. Vergeben Sie es als akzeptierte Antwort, da es generisch genug ist, um es für andere ähnliche Probleme zu verwenden, die sich nicht auf XML beziehen. –

1

Kasse BeanUtils.setProperty

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

+1

Ich weiß nicht warum, aber ich konnte das mit meinem derzeitigen Setup nicht schaffen (Play!Framework, JPA und Hibernate), aber trotzdem danke. Behalte es für die Zukunft im Gedächtnis. –

5

Java kennt viele Frameworks für XML-Verarbeitung. Auch einige Bibliotheken zum Serialisieren/Deserialisieren von Objekten zu/von XML. Ich würde empfehlen, sich JAXB anzusehen.

+0

Werde mich definitiv darum kümmern, danke! Wie ich bereits in einem anderen Kommentar gesagt habe, ist mein XML-Parsing für den Augenblick (mit SAX und einem benutzerdefinierten Handler) geeignet, also wollte ich nur die letzte Änderung hinzufügen (enge Deadlines!). Ich werde JAXB einen Wirbel geben, wenn ich das nächste Mal neu anfange, klingt cool :) –

2

Eine andere Möglichkeit wäre, etwas wie XStream zum Serialisieren/Deserialisieren Ihrer Entitäten zu und von XML zu verwenden.

+0

Wie bei meinem JAXB-Kommentar habe ich nicht wirklich Zeit, das gesamte Parsing zu wiederholen (ich bin besonders vorsichtig, da es sich um JPA-Entities und nicht nur um Standardobjekte handelt). Aber ich werde definitiv XStream einen Wirbel geben, sobald die Arbeitsbelastung ein wenig nachlässt. Danke für Ihre Hilfe! –

0

Hmm, vielleicht nicht die beste Lösung, aber man könnte auch einfach eine Karte verwenden:

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

und:

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

Ja, ich habe auch daran gedacht, aber ich weiß nicht, wie ich es mit JPA spielen könnte. Danke trotzdem :) –

0

Sie könnten die Verwendung sehr gut Apache Commons Lang bekannt und dann so etwas tun :

FieldUtils.writeField(myObject, fieldName, fieldValue); 
Verwandte Themen