JAXB代码注入Enum类

时间:2014-06-18 03:03:51

标签: java enums jaxb xsd tostring

背景问题是当我们反思JAXB生成的Enum类时,调用toString()@override toString() .name()将返回.value()而不是toString() Enum。所以,我想注入自己的complexType

我无法将代码注入到JAXB生成的Enum类中。虽然,我能够在顶级 <jxb:bindings node="/xs:schema/xs:complexType[@name='QueryPgm']/xs:sequence/xs:element[@name='STATUS']/xs:simpleType"> 注入代码,但不能在内联"-verbose -Xinject-code -extension" 类中注入代码。

以下是我们所讨论的XSD部分(我尝试过绝对和亲戚):

<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>

我使用这些args:

{{1}}

没有出现错误,输出为:

  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

以下是相关架构的部分:

{{1}}

我希望得到帮助或想法。谢谢。

1 个答案:

答案 0 :(得分:0)

  

今天是2019年4月25日,不确定作者是否仍在寻找   5年后针对此类问题的解决方案   关心,将代码片段注入到生成的枚举类中很好   通过jaxb(jvnet插件)。原因是我们尝试支持xml   和json反序列化仅由旧版jaxb生成的类   xml注释。所以我们真的不需要任何Maven的json注释   json插件(您不能同时使用jaxb和json插件来生成   具有json和xml批注的类。将会是一场灾难)。所以   那些旧的jaxb生成的java类可用于json字符串   反序列化(响应进入)。枚举name()和value()为   痛苦。由于jaxb已移至另一个有400多个问题的站点   https://github.com/javaee/jaxb-v2,其中大多数甚至都没有   正在积极开发或即将修复。所以我在下面尝试修复   name()和value()问题,所以当Enum实例的toString()是   可以返回称为“实际值”的字母,而不是大写字母   名称。以下是一些代码段和插件信息:

活页夹文件:

<xs:simpleType name="localetype">
    <xs:restriction base="xs:string">
        <xs:enumeration value="en_US"/>
        <xs:enumeration value="de_DE"/>
    </xs:restriction>
</xs:simpleType>

locale.xsd

<xs:element name="customLocale" type="localetype"/>

main.xsd

<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>

maven插件

@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();
                    }    
}

生成了jaxb类

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);

jackson客户端代码配置。

import numpy as np
import ast
string="[['9.5820988666217111e-001','1.8364288924172481e-002','2.8547603401192861e-001','-1.0076250938522580e+001'],['-1.7086800960614995e-001','-7.6361969781499617e-001','6.2264683441110236e-001','-4.5906868751556480e+001'],['2.2942958919045936e-001','-6.4540507435349748e-001','-7.2857007460000278e-001','2.1664174288937179e+001'],['0.0000000000000000e+000','0.0000000000000000e+000','0.0000000000000000e+000','1.0000000000000000e+000']]"
c=ast.literal_eval(string) 

不要忘记以下几点:      READ_ENUMS_USING_TO_STRING为true(杰克逊2.x版)