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