2

XML から非整列化できるようにしたい Java クラスから始めています。スキーマを決定しながら進めています。次のような XML を使用したいと思います。

<Person fname="John" lname="Doe">
  <bio><foo xmlns="http://proprietary.foo">Blah <bar>blah</bar> blah</foo></bio>
</Person>

次のような Java クラスに注釈を付けたいと考えています。

public class Person {
  @XmlAttribute
  public String fname;

  @XmlAttribute
  public String lname;

  @XmlElement
  public ProprietaryFoo bio;
}

<foo xmlns="http://proprietary.foo"> 要素を渡したいのですが、それは次のように機能するコンパイル済みファクトリ クラスの子孫です。

FooFactory.getFooFromDomNode(myFooElement) // Returns a private ProprietaryFooImpl as an instance of the public ProprietaryFoo Interface

ProprietaryFoo の DomHandler を作成する必要があるようですが、よくわかりません (「com.xyz.ProprietaryFooImpl も、そのスーパー クラスも、このコンテキストでは認識されていません」を取得していました)。 XmlJavaTypeAdapter に興味がある ValueType を Element として受け取る方法がわかりません。

4

1 に答える 1

2

単純な Wrapper クラスとともに XmlAdapter と DomHandler の両方を使用することになりました。

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

なんらかの理由で、これは com.sun 名前空間の標準クラスでは機能しませんでしたが、MOXy はそれをうまく処理します。

于 2011-04-01T20:46:45.753 に答える