JAXB - XJC - 影响生成的类型安全枚举类和成员
当使用 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()
方法而不是 value()
方法进一步将 XJC 编译调整为更有用的枚举的经验? 或者我可以添加一个方法什么的吗?
PS 这发生在 JAXB v2.0.3 中。 我下载了最新版本v2.1.8,那里是一样的......
When compiling the following simpleType with the XJC compile (from the JAXB package)...
<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>
I end up with the following enum in Java (import statements and comments removed)
@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());
}
}
This is exactly what I want... except for the public String value()
method. I would expect the method to be called public String getValue()
according to Sun's naming conventions. That way I can easily use it in a JSP-page using EL. Now I have to work my way around it.
Does anybody have any experience in further tweaking the XJC compilation to a more useful enumeration with a getValue()
method, instead of a value()
method? Or can I add a method or something?
P.S. This occurred in v2.0.3 of JAXB. I downloaded the latest version v2.1.8 and it's the same there...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
JAXB 规范中似乎没有任何内容允许这种更改。 我认为做到这一点的唯一方法是编写一个 JAXB 插件。
There's nothing in the JAXB spec that seems to allow this change. I think the only way to do this would be to write a JAXB Plugin.
您可以创建生成的类的一个小变体,该变体仅与生成的该方法的名称不同。 然后在运行时,您必须确保加载您的变体而不是生成的变体,玩类加载器游戏。
当然,这只有在原始 XSD 不经常更改的情况下才有效。
you could create a small variant of the generated class that only differs from the generated one for the name of this method. then at runtime, you have to make sure your variant is loaded instead of the generated one, playing the classloader game.
Of course, this can only work is the original XSD doesn't change often.