jaxb2-maven-plugin使用说明

jaxb2-maven-plugin是一个用来代替xjc和schemagen用来完成java类和schema文件之间互相转换的maven插件.
使用说明:官方地址
源码地址:github
首先在pom配置该插件:

<plugin>
                <groupId>org.codehuas.jaxb2</groupId>
                <artifactId>jaxb2-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <createJavaDocAnnotations>true</createJavaDocAnnotations>
                    <encoding>utf-8</encoding>
                    <schemaSourceExcludeFilters>
                        <noJaxbIndex implementation="org.codehaus.mojo.jaxb2.shared.filters.pattern.PatternFileFilter">
                            <patterns>
                                <pattern>com.test.*</pattern>
                            </patterns>
                        </noJaxbIndex>
                    </schemaSourceExcludeFilters>
                </configuration>
            </plugin>

主要运行命令为jaxb2:schemagen和jaxb2:xjc,分别用来从Java类生成schema和从schema文件生成Java类.具体配置参考官方文档.

实际使用过程中遇到的问题:

在使用jaxb2:schemagen生成schema文件时,如果Java bean属性名称和指定的name不一样时无法生成doc文档片段,如下:

package com.test;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * 人员信息
 * Created by wenjiangchun on 16-3-15.
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Person {

    /**
     * 人员名称
     */
    @XmlElement(name = "username", required = true)
    private String name;

    /**
     * 住址信息
     */
    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

执行jaxb2:schemagen后生成schema文件如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">

  <xs:element name="person" type="person"/>

  <xs:complexType name="person">
    <xs:annotation>
      <xs:documentation><![CDATA[人员信息
Created by wenjiangchun on 16-3-15.]]></xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="username" type="xs:string"/>
      <xs:element minOccurs="0" name="address" type="xs:string">
        <xs:annotation>
          <xs:documentation><![CDATA[住址信息]]></xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

可以看到,Person类中属性名称为”name”,指定的schema文档中对应的属性名称为”username”,这种情况下不会将属性注释生成出来.

解决办法:
将插件源码从github上clone出来,查看源码中下面类:

org.codehaus.mojo.jaxb2.schemageneration.postprocessing.javadoc.JavaDocExtractor

从类名称可以知道该类主要用来获取Java Doc描述信息,在类中process方法中找到如下代码片段:

for (JavaField currentField : currentClass.getFields()) {
                    // Add the field-level JavaDoc
                    String currentFieldName = currentField.getName();

                    final FieldLocation fieldLocation = new FieldLocation(
                            packageName,
                            simpleClassName,
                            currentFieldName);
                    addEntry(dataHolder, fieldLocation, currentField);

                    if (log.isDebugEnabled()) {
                        log.debug("Added field-level JavaDoc for [" + fieldLocation + "]");
                    }
                }

将以上代码修改如下:

 for (JavaField currentField : currentClass.getFields()) {
                    // Add the field-level JavaDoc
                    String currentFieldName = currentField.getName();
                    List<JavaAnnotation> list = currentField.getAnnotations();
                    for (JavaAnnotation annotation : list) {
                        if (annotation.getType().getName().equals("XmlAttribute") || annotation.getType().getName().equals("XmlElement")) {
                            if (annotation.getProperty("name") != null) {
                                currentFieldName = annotation.getProperty("name").toString();
                                currentFieldName = currentFieldName.replaceAll("\"", "");
                            }
                        }
                    }
                    final FieldLocation fieldLocation = new FieldLocation(
                            packageName,
                            simpleClassName,
                            currentFieldName);
                    addEntry(dataHolder, fieldLocation, currentField);

                    if (log.isDebugEnabled()) {
                        log.debug("Added field-level JavaDoc for [" + fieldLocation + "]");
                    }
                }

以上代码意思就是如果Java Bean属性上指定了@XmlAttribute或@XmlElement注解,就使用该注解中指定的name作为currentFieldName.
如果注解是加在方法上,同样可以通过以上途径来获取当前name.
最后重新打包执行命令jaxb2:schemagen测试:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">

  <xs:element name="person" type="person"/>

  <xs:complexType name="person">
    <xs:annotation>
      <xs:documentation><![CDATA[人员信息
Created by wenjiangchun on 16-3-15.]]></xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="username" type="xs:string">
        <xs:annotation>
          <xs:documentation><![CDATA[人员名称]]></xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element minOccurs="0" name="address" type="xs:string">
        <xs:annotation>
          <xs:documentation><![CDATA[住址信息]]></xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

注意:每次生成前需要执行下clean命令将原有生成的删除再执行jaxb2:schemagen命令,或者直接执行 clean jaxb2:schemagen.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值