JAXB/MOXy:如何部分解组,将给定节点的后代传递给封闭/专有类?

JAXB/MOXy:如何部分解组,将给定节点的后代传递给封闭/专有类?,jaxb,eclipselink,moxy,Jaxb,Eclipselink,Moxy,我从一些Java类开始,我希望这些Java类能够从XML中解压出来——我将一边确定模式。我希望使用类似于以下内容的XML: <Person fname="John" lname="Doe"> <bio><foo xmlns="http://proprietary.foo">Blah <bar>blah</bar> blah</foo></bio> </Person> public class P

我从一些Java类开始,我希望这些Java类能够从XML中解压出来——我将一边确定模式。我希望使用类似于以下内容的XML:

<Person fname="John" lname="Doe">
  <bio><foo xmlns="http://proprietary.foo">Blah <bar>blah</bar> blah</foo></bio>
</Person>
public class Person {
  @XmlAttribute
  public String fname;

  @XmlAttribute
  public String lname;

  @XmlElement
  public ProprietaryFoo bio;
}
我想将元素及其后代传递给编译的工厂类,其工作方式如下:

FooFactory.getFooFromDomNode(myFooElement)//返回私有propertaryFooImpl作为公共propertaryFoo接口的实例


似乎我需要为ProprietaryFoo创建一个DomHandler,但我还没有完全弄明白(我得到的是“com.xyz.ProprietaryFooImpl,它的任何超类在此上下文中都不为人所知。”)我还对XmlJavaTypeAdapter感兴趣,我不知道如何将ValueType作为元素接收。

最后使用了XmlAdapter和DOMDhandler以及一个简单的包装类

public class FooWrapper {
    @XmlAnyElement(FooDomHandler.class)
    public ProprietaryFoo foo;
}

public class FooXmlAdapter extends XmlAdapter<FooWrapper, ProprietaryFoo> {
    @Override
    public ProprietaryFoo unmarshal(FooWrapper w) throws Exception {
        return w.foo;
    }

    @Override
    public FooWrapper marshal(ProprietaryFoo f) throws Exception {
        FooWrapper fooWrapper = new FooWrapper();
        fooWrapper.foo = f;
        return fooWrapper;
    }
}

/* The vendor also provides a ProprietaryFooResult class that extends SAXResult */
public class FooDomHandler implements DomHandler<ProprietaryFoo, ProprietaryFooResult> {

    @Override
    public ProprietaryFooResult createUnmarshaller(ValidationEventHandler validationEventHandler) {
        return new ProprietaryFooResult();
    }

    @Override
    public ProprietaryFoo getElement(ProprietaryFooResult r) {
        return r.getProprietaryFoo();
    }

    @Override
    public Source marshal(ProprietaryFoo f, ValidationEventHandler validationEventHandler) {
        return f.asSaxSource();
    }
}
公共类FooWrapper{
@XmlAnyElement(FooDomHandler.class)
公共财产公司foo foo;
}
公共类FooXmlAdapter扩展了XmlAdapter{
@凌驾
public propertaryFoo unmarshal(FooWrapper w)引发异常{
返回w.foo;
}
@凌驾
公共FooWrapper封送处理程序(ProprietaryFoo f)引发异常{
FooWrapper=newFooWrapper();
fooWrapper.foo=f;
返回包装器;
}
}
/*供应商还提供了一个ProprietaryFooResult类,该类扩展了SAXResult*/
公共类FooDomHandler实现了DomHandler{
@凌驾
公共专有权FooResult createUnmarshaller(ValidationEventHandler ValidationEventHandler){
返回新的propertaryFooResult();
}
@凌驾
公共propertaryFoo getElement(propertaryFooResult r){
返回r.getpropertaryfoo();
}
@凌驾
公共源封送员(ProprietaryFoo f,ValidationEventHandler ValidationEventHandler){
返回f.asSaxSource();
}
}
无论出于何种原因,这对com.sun命名空间中的标准类都不起作用,但MOXy处理得很好