我想在使用XmlJavaTypeAdapter时使用xjc生成JAXB对象
我目前在全局绑定中使用以下内容:
<xjc:javaType name="java.lang.Boolean"
xmlType="xsd:boolean"
adapter="path.to.my.CustomBooleanAdapter"/>
它生成以下代码:
@XmlJavaTypeAdapter(CustomBooleanAdapter.class)
@XmlElement(type=String.class)
private Boolean finished;
但是我希望代码的@XmlSchemaType为boolean且没有@XmlElement类型String
@XmlJavaTypeAdapter(BooleanAdapter.class)
@XmlSchemaType(name = "boolean")
private Boolean finished;
适配器代码:
public class CustomBooleanAdapter extends XmlAdapter<String, Boolean> {
@Override
public Boolean unmarshal(String s) {
if("true".equals(s) || "false".equals(s)){
return Boolean.valueOf(s);
}
return null;
}
@Override
public String marshal(Boolean c) {
return c == null ? null : c.toString();
}
}
有没有办法告诉xjc生成@XmlSchemaType注释并删除String类型的@XmlElement
答案 0 :(得分:1)
好的,正如所承诺的那样。
Annotate plugin允许您为生成的代码添加注释。
SO免责声明:我是作者。
文档为here。
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:annox="http://annox.dev.java.net"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="annox xjc"
jaxb:version="1.0">
<xs:annotation>
<xs:appinfo>
<jaxb:globalBindings>
<xjc:javaType name="java.lang.Boolean" xmlType="xs:boolean" adapter="org.jvnet.jaxb2_commons.tests.one.CustomBooleanAdapter"/>
</jaxb:globalBindings>
</xs:appinfo>
</xs:annotation>
<xs:complexType name="javaTypeExample">
<xs:sequence>
<xs:element name="customBooleanProperty" type="xs:boolean" minOccurs="0">
<xs:annotation>
<xs:appinfo>
<annox:annotate target="field">@javax.xml.bind.annotation.XmlElement(type=java.lang.Boolean.class)</annox:annotate>
<annox:annotate target="field">@javax.xml.bind.annotation.XmlSchemaType(name="boolean")</annox:annotate>
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
生成:
@XmlElement(type = Boolean.class)
@XmlJavaTypeAdapter(CustomBooleanAdapter.class)
@XmlSchemaType(name = "boolean")
protected Boolean customBooleanProperty;
关于使用的几点注意事项:
target="field"
,因为您必须在字段上添加注释,否则默认情况下它们会被添加到getter中。@XmlElement
注释(没有此类功能),但您可以使用@XmlElement(type=Boolean.class)
覆盖它。我还添加了一个小test case。