我可以在MOXy DynamicEntities上设置空值的嵌套值吗?

时间:2013-08-12 19:25:22

标签: java jaxb eclipselink moxy

我正在使用EclipseLink MOXy动态实体创建,并且遇到了一件事。我的应用程序在代码库中没有用于下游SOAP服务的库。但是在启动时使用 DynamicJAXBContextFactory.createContextFromXSD()创建所有对象。从这里开始,我使用自己的本地定义对象并使用应用程序中的元数据进行转换。如果我的下游对象很简单,没有嵌套类,我可以毫无问题地创建转换后的对象。但是说我有一个下游的DynamicType,如:

class Person {
    class Address {
        String city;
        String state;
    }
    String first;
    String last;
    Address address;
}

我尝试使用XPath方法设置创建person对象:

DynamicEntity person = jaxbContext.newDynamicEntity(jaxbContext.getDynamicType( "Person" ));
jaxbContext.setValueByXPath( person, "first/text()", null, "Tres");
jaxbContext.setValueByXPath( person, "last/text()", null, "Bailey");
jaxbContext.setValueByXPath( person, "address/city/text()", null, "Cowpens");
jaxbContext.setValueByXPath( person, "address/state/text()", null, "SC");

前两个设定值有效,但如果人是一个全新的对象,则设置城市和州的后两行不会设置值。有意义的是它们不起作用,因为地址对象尚未设置值。但在我的用例中,我试图避免使用特定于服务的绑定文件,并且不希望遍历每个DynamicTypes以在每个设置上查找字段及其类型。这在MOXy中甚至可能吗?

我使用EclipseLink 2.5版并在带有Java 6的Tomcat 7上运行。

1 个答案:

答案 0 :(得分:0)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。

您需要执行以下操作:

    jaxbContext.setValueByXPath( person, "first/text()", null, "Tres");
    jaxbContext.setValueByXPath( person, "last/text()", null, "Bailey");

    Object address = jaxbContext.createByXPath(person, "address", null, Object.class);
    jaxbContext.setValueByXPath(person, "address", null, address);

    jaxbContext.setValueByXPath( person, "address/city/text()", null, "Cowpens");
    jaxbContext.setValueByXPath( person, "address/state/text()", null, "SC");

我可以在你的问题中看到你正在寻找的行为。您是否介意使用以下链接输入增强请求: