2

生成されたクラスインスタンスschemaLocationをマーシャリングするときに、属性を適切に出力しようとしています。xjcルート要素クラスは次のようになります。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "rootElement"
})
@XmlRootElement(name = "ROOTELEMENT")
public class ROOTELEMENT {
    // Members
}

package-info.java生成されたすべてのクラスが含まれるパッケージに、次の内容のクラスが含まれていることがわかります。

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://my.own.namespace", 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package my.generated.classes.package;

JAXB XJCコード生成への答え-マーシャラーによって生成されたxmlに欠落している「schemaLocation」は、プロパティの設定を提案し、 Marshaller.JAXB_SCHEMA_LOCATION実際に機能します。

marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://my.own.namespace my_schema.xsd");

ただし、次のように名前空間を入力することは避けたいと思います。

String namespace = getNamespace(rootElementInstance);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, namespace + " my_schema.xsd");

getNamespace()関数の実装方法に関するヒントをいただければ幸いです。


編集XmlRootElementXmlTypeアノテーションにnamespace()メソッドがあることを確認しました。これは私が求めているもののようです(実際には、でXmlSchema提供されているものを委任しているようですpackage-info.java)。ROOTELEMENTただし、これらのタイプのいずれにもキャストされたインスタンスを取得できません。

4

1 に答える 1

3

パッケージを手に入れる必要があります(たとえばROOTELEMENT.class.getPackage()、ROOTELEMENTが必要なパッケージに含まれている場合に使用します)。次に、次のように簡単に処理できます。

Package package = // Here retrieve the package;
String namespace = package.getAnnotation(XmlSchema.class).namespace();
...etc...
于 2012-04-30T13:22:08.207 に答える