【问题标题】:Java / JPA - dynamically setting properties on an object / entityJava / JPA - 在对象/实体上动态设置属性
【发布时间】:2012-03-27 14:58:52
【问题描述】:

我对 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 语句?

任何帮助将不胜感激。

干杯!

【问题讨论】:

  • 接受的答案是当时解决问题的好方法。几个月后,请求进行了一大堆更改,因此值得花时间尝试建议的库,它们很棒 - 感谢您的建议。我现在正在移植到 XStream。干杯!

标签: java hibernate jpa playframework


【解决方案1】:

Java 知道很多用于 XML 处理的框架。还有一些用于将对象序列化/反序列化到 xml 的库。我建议看看JAXB

【讨论】:

  • 一定会调查的,谢谢!正如我在另一条评论中所说,虽然我的 XML 解析现在适合目的(使用 SAX 和自定义处理程序),但我只想添加最后的调整(截止日期紧迫!)。下次我重新开始时会给 JAXB 一个旋转,听起来很酷:)
【解决方案2】:

您必须使用反射(省略错误处理)。

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

但我支持其他建议 XStream 的人。这是解析 XML 文件的一种更简洁的方法。

【讨论】:

  • 我认为使用 XStream 并肯定会研究它,但现在,由于我的 XML 解析是“足够的”,这对我非常感谢。授予它作为公认的答案,因为它足够通用,可以用于其他与 XML 无关的类似问题。
【解决方案3】:

另一种选择是使用 XStream 之类的东西将您的实体序列化/反序列化到 xml。

【讨论】:

  • 与我的 JAXB 评论一样,我真的没有时间重新进行所有解析(我特别谨慎,因为我正在处理 JPA 实体,而不仅仅是标准对象)。但是一旦工作量减轻一点,我肯定会试一试 XStream。感谢您的帮助!
【解决方案4】:

检查 BeanUtils.setProperty

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

【讨论】:

  • 我不知道为什么,但我无法让它与我当前的设置(Play!框架、JPA 和 Hibernate)一起工作,但无论如何感谢。将来会牢记这一点。
【解决方案5】:

嗯,也许不是最好的解决方案,但您也可以简单地使用地图:

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);
}  

【讨论】:

  • 是的,我也想过,但我不知道如何让它与 JPA 很好地配合使用。无论如何谢谢:)
【解决方案6】:

您可以使用众所周知的Apache Commons Lang,然后执行以下操作:

FieldUtils.writeField(myObject, fieldName, fieldValue);

【讨论】:

    猜你喜欢
    • 2012-07-26
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2011-02-25
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    相关资源
    最近更新 更多