質問

次のsimpleTypeをXJCコンパイル(JAXBパッケージから)でコンパイルする場合...

<xs:simpleType name="test">
    <xs:annotation>
        <xs:appinfo>
            <jaxb:typesafeEnumClass/>
        </xs:appinfo>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="4">
        <xs:annotation>
          <xs:appinfo>
            <jaxb:typesafeEnumMember name="FOUR"/>
          </xs:appinfo>
        </xs:annotation>
      </xs:enumeration>      
      <xs:enumeration value="6">
        <xs:annotation>
          <xs:appinfo>
            <jaxb:typesafeEnumMember name="SIX"/>
          </xs:appinfo>
        </xs:annotation>
      </xs:enumeration>
     </xs:restriction>
</xs:simpleType>

私は次のJavaの列挙型になります(インポート文とコメントは削除されました)

@XmlEnum
public enum Test {

    @XmlEnumValue("4")
    FOUR("4"),
    @XmlEnumValue("6")
    SIX("6");
    private final String value;

    Test(String v) {
        value = v;
    }

    public String value() {
        return value;
    }

    public static Test fromValue(String v) {
        for (Test c: Test.values()) {
            if (c.value.equals(v)) {
                return c;
            }
        }
        throw new IllegalArgumentException(v.toString());
    }

}

これはまさに私が望むものです... public String value()メソッドを除きます。このメソッドは、Sunの命名規則に従って public String getValue()と呼ばれることを期待しています。そうすれば、ELを使用してJSPページで簡単に使用できます。今、私はそれを回避する必要があります。

value()メソッドの代わりに、 getValue()メソッドを使用して、XJCコンパイルをさらに便利な列挙に微調整した経験はありますか?または、メソッドなどを追加できますか?

PSこれは、JAXB v2.0.3で発生しました。最新バージョンv2.1.8をダウンロードしましたが、同じバージョンです...

役に立ちましたか?

解決

JAXB仕様には、この変更を許可していると思われるものは何もありません。これを行う唯一の方法はJAXBプラグインを書くことだと思います。

他のヒント

生成されたクラスの小さなバリアントを作成できます。このバリアントは、このメソッドの名前に対して生成されたクラスとのみ異なります。その後、実行時に、生成されたバリアントではなくバリアントがロードされていることを確認して、クラスローダーゲームをプレイする必要があります。

もちろん、これは元のXSDが頻繁に変更されない場合にのみ機能します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top