后台问题是,当我们反映JAXB生成的Enum
类时,调用toString()
,如果没有toString()
的@override
,将返回.name()
而不是.value()
。所以,我想注射我自己的toString()
。
我无法将代码注入JAXB生成的Enum
类。虽然,我能够在顶级complexType
注入代码,但不能在内联Enum
类中注入代码。
下面是所讨论的XSD部分(我尝试过绝对和相对):
<jxb:bindings node="/xs:schema/xs:complexType[@name='QueryPgm']/xs:sequence/xs:element[@name='STATUS']/xs:simpleType">
我使用这些参数:
"-verbose -Xinject-code -extension"
没有错误显示,输出为:
<>之前解析模式…编译模式…[INFO]生成代码未知的位置com/ibm/query/pgm/ObjectFactorycom/ibm/query/pgm/QueryPgmcom/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>
我很感激别人的帮助或建议。谢谢。
今天是2019年4月25日,不确定作者是否还在寻找一个不管怎样,这类问题5年后才能解决注意,将代码片段注入生成的枚举类可以很好地工作通过jaxb(jvnet插件)。原因是我们试图支持XML而json反序列化由遗留jaxb生成的类只有xml注释。所以我们并不需要任何maven的json注解Json插件(您不能同时应用jaxb和Json插件来生成带有json和XML注释的类。这将是一场灾难)。所以那些遗留的jaxb生成的Java类可以用于json字符串反序列化(响应进来)。而enum name()和value()是一个痛苦。因为jaxb已经转移到另一个有400多个问题的站点https://github.com/javaee/jaxb-v2,其中大部分都不是偶数正在积极开发或即将修复。所以我试着在下面修复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>
locale.xsd
<xs:simpleType name="localetype">
<xs:restriction base="xs:string">
<xs:enumeration value="en_US"/>
<xs:enumeration value="de_DE"/>
</xs:restriction>
</xs:simpleType>
main.xsd
<xs:element name="customLocale" type="localetype"/>
maven插件<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>
生成jaxb类
@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);
别忘了这一点:READ_ENUMS_USING_TO_STRING为trueX版本)