Java / JPA - динамическая установка свойств объекта / объекта - PullRequest
2 голосов
/ 27 марта 2012

Я относительно новичок в Java и буду признателен за любую помощь в этом!

У меня есть файл 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?

Любая помощь будет принята с благодарностью.

Ура!

Ответы [ 6 ]

5 голосов
/ 27 марта 2012

Java знает много фреймворков для обработки XML. Также некоторые библиотеки для сериализации / десериализации объектов в / из XML. Я бы порекомендовал взглянуть на JAXB .

3 голосов
/ 27 марта 2012

Вам придется использовать рефлексию (обработка ошибок опущена).

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

Но я поддерживаю других, кто предложил XStream.Это намного более чистый способ анализа XML-файлов.

2 голосов
/ 27 марта 2012

Другой вариант - использовать что-то вроде XStream для сериализации / десериализации ваших сущностей в xml и из XML.

1 голос
/ 27 марта 2012

Оформить заказ BeanUtils.setProperty

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

0 голосов
/ 20 мая 2017

Вы можете использовать очень известный Apache Commons Lang и затем сделать что-то вроде этого:

FieldUtils.writeField(myObject, fieldName, fieldValue);
0 голосов
/ 27 марта 2012

Хм, возможно, не лучшее решение, но вы также можете просто использовать карту:

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);
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...