使用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,它也是一样的......

有帮助吗?

解决方案

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

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top