JAXB – XJC – влияние на сгенерированный типобезопасный класс перечисления и его члены

StackOverflow https://stackoverflow.com/questions/218067

Вопрос

При компиляции следующего 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() метод.Я ожидаю, что метод будет вызван public String getValue() в соответствии с соглашениями об именах Sun.Таким образом, я могу легко использовать его на JSP-странице, используя EL.Теперь мне нужно обойти это.

Есть ли у кого-нибудь опыт дальнейшей настройки компиляции XJC для более полезного перечисления с помощью getValue() метод вместо value() метод?Или я могу добавить метод или что-то еще?

P.S.Это произошло в версии 2.0.3 JAXB.Скачал последнюю версию v2.1.8 и там то же самое...

Это было полезно?

Решение

В спецификации JAXB нет ничего, что допускало бы такое изменение.Я думаю, что единственный способ сделать это — написать плагин JAXB.

Другие советы

вы можете создать небольшой вариант сгенерированного класса, который отличается от сгенерированного только именем этого метода.затем во время выполнения вы должны убедиться, что ваш вариант загружен вместо сгенерированного, играя в игру загрузчика классов.

Конечно, это может работать только в том случае, если исходный XSD не меняется часто.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top