2

構成によって 3 番目のクラスを共有する 2 つのトップレベル クラスがあります。例:

@XmlRootElement
@XmlType(namespace = "http://example.com/foo")
public class Foo {
    public Shared shared;
}

@XmlRootElement
@XmlType(namespace = "http://example.com/bar")
public class Bar {
    public Shared shared;
}

public class Shared {
    public String string;
}

これらの各クラスは、異なるコンパイル ユニット (モジュール) の異なるパッケージに割り当てられます。各最上位クラスで schemagen を使用する場合、Shared クラスに最上位クラスと同じ名前空間を持たせたいと考えています。したがって、Foo の出力は次のようになります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="foo" type="Foo"/>

  <xs:complexType name="Foo">
    <xs:sequence>
      <xs:element name="shared" type="Shared" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Shared">
    <xs:sequence>
      <xs:element name="string" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

ただし、このようには機能しません。代わりに、Shared クラスにはデフォルトの名前空間があるため、2 つのスキーマ ファイルを取得します。1 つは Foo の名前空間用で、もう 1 つは Shared の名前空間用です。

Shared クラスを複製して共有しないという明らかな解決策なしに、これを修正する方法はありますか?

4

2 に答える 2

1

この問題を調査し、オプションを検討した後、設計を変更し、すべてのクラスに対して 1 つの名前空間のみを使用することにしました。根拠は次のとおりです。

  1. クラスと名前空間の関係は当然 1 対 1 です。インスタンス ドキュメントが適切に検証されるように XSD を手動でモックアップしたとしても、JAXB アンマーシャラーは一致しない名前空間に属する要素を無視するため、XSD をハッキングしてもまったく役に立ちません。

  2. 複数のパッケージとコンパイル ユニットで同じ名前空間を簡単に再利用できます。クラスパスを正しく設定するだけでよく、jaxb2-maven-plugin を使用するときに Maven が自動的に設定してくれます。

  3. すべてのクラスを 1 つの名前空間に簡単に関連付けることができ、トップレベルの要素ごとに異なる XSD ファイルを保持できます。利点は、各出力 XSD ファイルには、schemagen の実行時に含まれるルート要素クラスから参照されるクラス (つまり、複合型) のみが含まれることです。

この変更を行った後、コンパイル ユニットごとに 1 つの XSD ファイルを取得します。各コンパイル単位には、ルート要素 (つまり、クラス) が 1 つだけ含まれます。各ルート要素は、ルート要素を表すクラスを通じて強力に到達可能な複合型のみを参照します。これはまさに私が欲しかったものです。

于 2013-09-22T16:51:44.153 に答える