JAXB - XJC - 影响生成的类型安全枚举类和成员

时间:2008-10-20 11:10:12

标签: xsd enums jaxb type-safety 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()方法进一步将XJC编译调整为更有用的枚举,而不是value()方法?或者我可以添加方法或其他东西吗?

P.S。这发生在JAXB的v2.0.3中。我下载了最新版本的v2.1.8,它也是一样的......

2 个答案:

答案 0 :(得分:1)

JAXB规范中似乎没有任何内容允许此更改。我认为执行此操作的唯一方法是编写JAXB插件。

答案 1 :(得分:0)

您可以创建生成的类的一个小变体,该变体仅与为此方法的名称生成的变体不同。然后在运行时,你必须确保你的变种被加载而不是生成的变种,玩类加载器游戏。

当然,这只能起作用,原来XSD不会经常改变。