如何为使用xjc:javaType自定义的元素生成@XmlSchemaType

时间:2014-10-01 17:28:56

标签: java xml jaxb xsd xjc

我想在使用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

1 个答案:

答案 0 :(得分:1)

好的,正如所承诺的那样。

Annotate plugin允许您为生成的代码添加注释。

SO免责声明:我是作者。

文档为here

Example

<?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中。
  • 语法是Java,但是......
  • ...您必须为所有内容使用完全限定的类名(注释,注释字段中的类等)。
  • 您无法删除@XmlElement注释(没有此类功能),但您可以使用@XmlElement(type=Boolean.class)覆盖它。

我还添加了一个小test case