JAXB - XJC - influenciando gerado typesafe classe enum e membros
-
03-07-2019 - |
Pergunta
Ao compilar o seguinte simpleType com a compilação XJC (do pacote 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>
eu acabar com o seguinte enum em Java (declarações de importação e comentários removidos)
@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());
}
}
Este é exatamente o que eu quero ... exceto para o método public String value()
. Espero que o método a ser chamado public String getValue()
de acordo com as convenções de nomenclatura da Sun. Dessa forma eu posso facilmente usá-lo em um JSP-página usando EL. Agora eu tenho que trabalhar o meu caminho em torno dele.
Alguém tem alguma experiência em mais ajustes a compilação XJC a uma enumeração mais útil com um método getValue()
, em vez de um método value()
? Ou eu posso adicionar um método ou algo assim?
P.S. Isto ocorreu em v2.0.3 de JAXB. Eu baixei a versão mais recente v2.1.8 e é o mesmo lá ...
Solução
Não há nada na especificação JAXB que parece permitir esta mudança. Acho que a única maneira de fazer isso seria escrever um JAXB Plugin.
Outras dicas
Você pode criar uma pequena variante da classe gerada que apenas difere o gerado para o nome do método. em seguida, em tempo de execução, você tem que se certificar que seu variante é carregado em vez do gerado, o jogo carregador de classe.
Claro, isso só pode trabalho é o XSD original não mudar frequentemente.