我正在寻找从 XML 定义创建和加载 JAVA 对象的最佳工具/方法。
我已经检查了 JAXB ,看起来很不错,但没有找到一种方法来处理属性是动态的或不时更改的实体,所以想要有类似自动处理实体的方式,而无需转换对象变成预定义的实体对象。这样的东西存在吗?

工作流就像这样从每个实体的 XML 创建类读取,并为这些实体创建动态属性集和/或创建 ORM 映射部分,然后所有操作检索/存储到数据库中,或者可能会使用一些 NoSQL 解决方案,如 MongoDB。

最佳答案

注意: 我是 EclipseLink JAXB (MOXy) 的负责人,也是 JAXB 2 ( JSR-222 ) 专家组的成员。

查看以下 EclipseLink 示例。它演示了如何在 JPA 和 JAXB 实现中使用动态属性:

  • http://wiki.eclipse.org/EclipseLink/Examples/MySports


  • 选项 #1 - 具有动态属性的静态对象

    MOXy 有一个 @XmlVirtualAccessMethods 扩展,它允许您将映射中的条目映射到 XML。这允许您向静态类添加属性。在下面的示例中,Customer 类具有“真实”名称属性,并且可能具有许多“虚拟”属性。
    package blog.metadatasource.refresh;
    
    import java.util.*;
    import javax.xml.bind.annotation.*;
    import org.eclipse.persistence.oxm.annotations.XmlVirtualAccessMethods;
    
    @XmlRootElement
    @XmlType(propOrder={"firstName", "lastName", "address"})
    @XmlVirtualAccessMethods
    public class Customer {
    
        private String name;
        private Map<String, Object> extensions = new HashMap<String, Object>();
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Object get(String key) {
            return extensions.get(key);
        }
    
        public void set(String key, Object value) {
            extensions.put(key, value);
        }
    
    }
    

    虚拟属性是通过 MOXy 的 XML 元数据定义的。在下面的示例中,我们将添加两个属性:middleName 和 shippingAddress。
    <?xml version="1.0"?>
    <xml-bindings
        xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
        package-name="blog.metadatasource.refresh">
        <java-types>
            <java-type name="Customer">
                <java-attributes>
                    <xml-element
                        java-attribute="middleName"
                        name="middle-name"
                        type="java.lang.String"/>
                    <xml-element
                        java-attribute="shippingAddress"
                        name="shipping-address"
                        type="blog.metadatasource.multiple.Address"/>
                </java-attributes>
            </java-type>
        </java-types>
    </xml-bindings>
    

    了解更多信息
  • http://blog.bdoughan.com/2011/06/extensible-models-with-eclipselink-jaxb.html
  • http://blog.bdoughan.com/2011/06/moxy-extensible-models-multi-tenant.html
  • http://blog.bdoughan.com/2011/06/moxy-extensible-models-multiple.html
  • http://blog.bdoughan.com/2011/06/moxy-extensible-models-refresh-example.html


  • 选项 #2 - 动态对象

    MOXy 还提供完整的动态对象模型:
    DynamicJAXBContext jaxbContext = DynamicJAXBContextFactory.createContextFromXSD(xsdInputStream, null, null, null);
    
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
    DynamicEntity customer = (DynamicEntity) unmarshaller.unmarshal(inputStream);
    
    DynamicEntity address = jaxbContext.newDynamicEntity("org.example.Address");
    address.set(street, "123 A Street");
    address.set(city, "Any Town");
    customer.set("address", address);
    
    Marshaller marshaller = jaxbContext.createMarshaller();
    marshaller.marshal(customer, System.out);
    

    了解更多信息
  • http://wiki.eclipse.org/EclipseLink/UserGuide/MOXy
  • http://wiki.eclipse.org/EclipseLink/Examples/MOXy/Dynamic
  • 关于Java 将 XML 解码为动态的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7273615/

    10-09 13:21