使用XJC编译(来自JAXB包)编译以下simpleType时......
<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页面中轻松使用它。现在我必须绕着它努力。
是否有人使用getValue()
方法进一步将XJC编译调整为更有用的枚举,而不是value()
方法?或者我可以添加方法或其他东西吗?
P.S。这发生在JAXB的v2.0.3中。我下载了最新版本的v2.1.8,它也是一样的......
答案 0 :(得分:1)
JAXB规范中似乎没有任何内容允许此更改。我认为执行此操作的唯一方法是编写JAXB插件。
答案 1 :(得分:0)
您可以创建生成的类的一个小变体,该变体仅与为此方法的名称生成的变体不同。然后在运行时,你必须确保你的变种被加载而不是生成的变种,玩类加载器游戏。
当然,这只能起作用,原来XSD不会经常改变。