16

Netbeans 7.1.2 で JaxB を使用すると問題が発生します。

JaxB (New JaxB Binding) を使用してスキーマからクラスを自動生成しました。Marshaller を使用して XML 文字列にシリアル化され、XML 文字列から新しいオブジェクト インスタンスに戻るオブジェクトを作成しています。ただし、次の例外が発生します。

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.somewhere.com/some/path", local:"MyQueryComplexTypeQuery"). Expected elements are (none)

XML 文字列へのマーシャリング/シリアル化は正常に機能します。問題を引き起こしているのは、非整列化/逆シリアル化されているときです。

次のコードを使用してオブジェクトを構築し、それを XML 文字列にマーシャリングしています。

// build the object
ObjectFactory of = new ObjectFactory();

MyQueryComplexType oaaqc = of.createMyQueryComplexType();
oaaqc.setField1("edit");
oaaqc.setField2("net");
oaaqc.setField3("24");

JAXBElement<MyQueryComplexType> createMyQueryComplexType = of.createMyQueryComplexTypeQuery(oaaqc);

// serialise to xml
StringWriter writer = new StringWriter();
JAXBContext context = JAXBContext.newInstance(MyQueryComplexType.class);            
Marshaller m = context.createMarshaller();
m.marshal(createMyQueryComplexType, writer);

// output string to console
String theXML = writer.toString();
System.out.println(theXML);

これにより、コンソールに次の XML (フォーマット済み) が生成されます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyQueryComplexTypeQuery xmlns="http://www.somewhere.com/some/path">
    <Field1>edit</Field1>
    <Field2>net</Field2>
    <Field3>24</Field3>
</MyQueryComplexTypeQuery>

次に、次のコードを使用して、文字列を新しいインスタンス MyQueryComplexType に逆シリアル化/非整列化します。

Unmarshaller u = context.createUnmarshaller();
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));

自動生成された package-info.java には、次の内容が含まれています。

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.somewhere.com/some/path", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package MyProject.SomeNamespace.MyQuery;

オブジェクト -> 文字列 -> オブジェクトという単純なプロセスでうまくいくと思いました。JaxB を使用するのはこれが初めてです (優しくしてください)。名前空間について言及している他の投稿を見たことがありますが、すべて問題ないように見えます。スキーマからクラスを自動生成し、オブジェクトを構築し、xml 文字列にマーシャリングしました。非整列化のプロセスを単純に逆にするのも同様だと思いました。

実際の例外は次の行でスローされます。

MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));

文字列からオブジェクトへのアンマーシャリングは簡単だと思いました。私が何か間違ったことをしているのか、何かが欠けているのかわかりません。皆さんが光を当てるか、目を開けてくれることを願っています。

エラーの原因となっているアプリの内容を簡素化するために、コードを削減しました。名前空間は、Web 上の情報の ID を保護するために変更されました。

何かご意見は?

ありがとう

アンデス

4

1 に答える 1

19

の作成JAXBContext

JAXBContextXML スキーマから生成された JAXB モデルの場合、特定のクラスではなくパッケージ名で を作成できます。

JAXBContext context = JAXBContext.newInstance("your.package.name");

いいえ:

JAXBContext context = JAXBContext.newInstance(MyQueryComplexType.class);  

ObjectFactoryこれにより、アノテーションを含むクラスが@XmlElementDecl正しく処理されることが保証されます。これは、ユースケースに欠けているものです。

アンマーシャル操作

MyQueryComplexTypeマーシャリング操作中に、のインスタンスをJAXBElement?でラップする必要があることに注意してください。これは、MyQueryComplexTypeに注釈が付けられておらず@XmlRootElement、ルート要素情報を から取得する必要があるためJAXBElementです。これは、アンマーシャリング操作を行うと、JAXBElementバックも取得することを意味します。

JAXBElement<MyQueryComplexTypeQuery> o = (JAXBElement<MyQueryComplexType>) u.unmarshal(new StringReader(theXML));

いいえ:

MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));

詳細については

于 2012-11-08T13:58:07.243 に答える