Java JAXB代码注入枚举类

Java JAXB代码注入枚举类,java,enums,jaxb,xsd,tostring,Java,Enums,Jaxb,Xsd,Tostring,背景问题是,当我们考虑JAXB生成的Enum类时,调用toString(),如果没有toString()的@覆盖,它将返回.name(),而不是.value()。因此,我想将自己的注入到字符串() 我无法将代码注入JAXB生成的Enum类。尽管如此,我能够在顶级complexType注入代码,但不能在内联Enum类中注入代码 下面是所讨论的XSD部分(我尝试过绝对和相对): 没有出现错误,输出为: parsing a schema... compiling a schema... [IN

背景问题是,当我们考虑JAXB生成的
Enum
类时,调用
toString()
,如果没有
toString()
@覆盖
,它将返回
.name()
,而不是
.value()
。因此,我想将自己的
注入到字符串()

我无法将代码注入JAXB生成的
Enum
类。尽管如此,我能够在顶级
complexType
注入代码,但不能在内联
Enum
类中注入代码

下面是所讨论的XSD部分(我尝试过绝对和相对):

没有出现错误,输出为:

parsing a schema... compiling a schema... [INFO] generating code unknown location com/ibm/query/pgm/ObjectFactory com/ibm/query/pgm/QueryPgm com/ibm/query/pgm/package-info 正在分析架构。。。 正在编译架构。。。 [信息]生成代码 未知位置 com/ibm/query/pgm/ObjectFactory com/ibm/query/pgm/QueryPgm com/ibm/query/pgm/package info 以下是有关模式的部分:

<xs:complexType name="QueryPgm">
<xs:sequence>
    <xs:element name="NAME" type="tns:nameOptions" minOccurs="1" maxOccurs="unbounded" />

    <xs:element name="SHOW" minOccurs="0" maxOccurs="unbounded">
        <xs:simpleType>
            <xs:annotation>
                <xs:appinfo>
                    <jxb:typesafeEnumClass name="showOptions"/>
                </xs:appinfo>
            </xs:annotation>
            <xs:restriction base="xs:string">
                <xs:enumeration value="ALL" />
            </xs:restriction>
        </xs:simpleType>
    </xs:element>

    <xs:element name="STATUS" minOccurs="0" maxOccurs="unbounded">
        <xs:simpleType>
            <xs:annotation>
                <xs:appinfo>
                    <jxb:typesafeEnumClass name="statusOptions"/>

                    <jxb:bindings node="/xs:schema/xs:complexType[@name='QueryPgm']/xs:sequence/xs:element[@name='STATUS']/xs:simpleType">
                        <ci:code>
                            @Override
                            public String toString() { return this.value();}
                        </ci:code>
                    </jxb:bindings>
                </xs:appinfo>
            </xs:annotation>

            <xs:restriction base="xs:string">
                <xs:enumeration value="DB-NOTAVL" />
                <xs:enumeration value="IOPREV" />
                <xs:enumeration value="LOCK" />
                <xs:enumeration value="NOTINIT" />
                <xs:enumeration value="STOSCHD" />
                <xs:enumeration value="TRACE" />
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
</xs:sequence>
</xs:complexType>

@凌驾
公共字符串toString(){返回此.value();}
如果有人能提供帮助或想法,我将不胜感激。谢谢

今天是2019年4月25日,不确定作者是否还在寻找答案 5年后解决这类问题,不管是谁 注意,将代码片段注入生成的枚举类中效果很好 通过jaxb(jvnet插件)。原因是我们试图支持xml 通过遗留jaxb生成的类进行json反序列化,只需 xml注释。因此,我们并不需要任何maven提供json注释 json插件(您不能同时应用jaxb和json插件来生成 包含json和xml注释的类。将是一场灾难)。所以 这些遗留jaxb生成的java类可以用于json字符串 反序列化(响应进入)。枚举名()和值()为 疼痛。因为jaxb已经转移到另一个有400多个问题的站点 ,其中大部分是不均匀的 正在积极开发或即将修复。所以我试着在下面修复 name()和value()问题,因此当枚举实例的toString()为 调用时,可以返回“实值”而不是大写 名字。以下是一些代码片段和插件信息:

活页夹文件:

<jaxb:bindings schemaLocation = "locale.xsd" node = "/xs:schema">
    <jaxb:bindings node = "xs:simpleType[@name='localetype']">
        <ci:code>
            <![CDATA[
            @Override
            public String toString() {
            return this.value();
            }
            ]]>
        </ci:code>
    </jaxb:bindings>
</jaxb:bindings>
杰克逊测试

compile 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
jackson客户端代码配置

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);
别忘了这一点:
使用字符串作为true读取枚举(jackson 2.x版本)

是否有名为
QueryPgm
的顶级复杂类型?如果有,请包含它,或者如果可能,请包含完整的模式。确定。编辑后我现在看到了。很高兴你能看到它;如果没有QueryPgm,我会得到一个文档节点不存在或类似的错误。不幸的是,我得到了一个干净的运行,但是没有代码被注入toString()方法。你解决了这个问题吗?David,我们没有解决这个问题,我有一些其他的想法,我添加到我们的待办事项中去尝试,当时间允许的时候,现在我们只是手动注入toString()函数,我们只需要在2或3个地方进行注入,这并不理想,但目前它仍然有效。
<xs:simpleType name="localetype">
    <xs:restriction base="xs:string">
        <xs:enumeration value="en_US"/>
        <xs:enumeration value="de_DE"/>
    </xs:restriction>
</xs:simpleType>
<xs:element name="customLocale" type="localetype"/>
<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.14.0</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <schemaDirectory>src/main/resources/schema</schemaDirectory>
        <bindingDirectory>src/main/resources/schema</bindingDirectory>
        <schemaIncludes>
            <include>*.xsd</include>
        </schemaIncludes>
        <forceRegenerate>true</forceRegenerate>
        <removeOldOutput>true</removeOldOutput>
        <verbose>true</verbose>
        <extension>true</extension>
        <args>
            <arg>-Xinject-code</arg>
            <arg>-extension</arg>
            <arg>-XhashCode</arg>
        </args>
        <plugins>
            <plugin>
                <groupId>org.jvnet.jaxb2_commons</groupId>
                <artifactId>jaxb2-basics</artifactId>
                <version>0.6.4</version>
            </plugin>
            <plugin>
                <groupId>org.jvnet.jaxb2_commons</groupId>
                <artifactId>jaxb2-basics-annotate</artifactId>
                <version>0.6.4</version>
            </plugin>
            <plugin>
                <groupId>org.jvnet.jaxb2_commons</groupId>
                <artifactId>jaxb2-default-value</artifactId>
                <version>1.1</version>
            </plugin>
        </plugins>
    </configuration>
</plugin>
@XmlType(name = "localetype", namespace = "http://www.xxxx.com/ns/datatype")
@XmlEnum
public enum Localetype {

    @XmlEnumValue("en_US")
    EN_US("en_US"),

    @XmlEnumValue("de_DE")
    DE_DE("de_DE"),


    private final String value;

    Localetype(String v) {
        value = v;
    }

    public String value() {
        return value;
    }

    public static Localetype fromValue(String v) {
        for (Localetype c: Localetype.values()) {
            if (c.value.equals(v)) {
                return c;
            }
        }
        throw new IllegalArgumentException(v);
    }


                    @Override
                    public String toString() {
                        return this.value();
                    }    
}
compile 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);