JDK中JAXB常用注解

  • @XmlRootElement

@Retention(RUNTIME)
@Target({TYPE})//作用在类上
public @interface XmlRootElement {
    //指定生成的元素所属的命名空间
    String namespace() default "##default";
    //指定生成元素的名字,若不指定则默认使用类名小写作为元素名
    String name() default "##default";
}

类级别的注解,将类映射为xml全局元素,也就是根元素。就像spring配置文件中的beans。常与@XmlType,@XmlAccessorType,@XmlAccessorOrder连用。

主意:如果属性字段是Null,也就是没有给属性设置值,那么JDK自带的JXABContext将JavaBean转成XML字符串时,是没有该属性字段的节点的。

  • @XmlElement

@Retention(RUNTIME) @Target({FIELD, METHOD, PARAMETER})
public @interface XmlElement {
   //指定生成元素的名字
    String name() default "##default";
   //指定元素的文本值是否可以为空,默认为false。
    boolean nillable() default false;
   //指定该元素是否必须出现,默认为false
    boolean required() default false;
   //指定该元素所属的命名空间
    String namespace() default "##default";
   //指定该元素默认的文本值
    String defaultValue() default "\u0000";
}

字段,方法,参数级别的注解。该注解可以将被注解的字段(非静态)映射为本地元素,也就是子元素。默认使用字段名。常与@XmlValue,@XmlJavaTypeAdapter,@XmlElementWrapper连用。
注意:
如果注解加在set方法上,是没问题的。
但是如果要加在filed字段上,那么需要与@XmlAccessorType(XmlAccessType.FIELD)一起使用,否则会报错(任何注解如果要加在字段上都需要这样)。

  • @XmlAttribute

 @Retention(RUNTIME) @Target({FIELD, METHOD})
 public @interface XmlAttribute {
   //属性名
    String name() default "##default";
   //属性是否必需
    boolean required() default false;
   //命名空间
    String namespace() default "##default" ;
}

字段和方法级别的注解。该注解会将字段映射成本类对应元素的属性,属性名默认使用字段名。

  • @XmlTransient

@Retention(RUNTIME) @Target({FIELD, METHOD, TYPE})
public @interface XmlTransient {}

类,字段,方法级别的注解。可使JAXB在映射xml元素时忽略被注解的类,字段,get/set对应字段。需要注意的是该注解与所有其他JAXB注释相互排斥,也就是说与其他注释连用就会报错。该注解没有属性。

  • @XmlAccessorType

@Inherited @Retention(RUNTIME) @Target({PACKAGE, TYPE})
public @interface XmlAccessorType {
   //可取的值是一个名为XmlAccessType的枚举类型里的值
    XmlAccessType value() default XmlAccessType.PUBLIC_MEMBER;
}

包和类级别的注解。javaEE的API对该注解的解释是:控制字段是否被默认序列化。通俗来讲,就是决定哪些字段或哪些get/set方法对应的字段会被映射为xml元素,需要注意的是字段或get/set方法的访问权限(public/private)会影响字段是否被映射为xml元素。

XmlAccessType的枚举类型包括:

  • XmlAccessType.PROPERTY
    1.当使用了该值,只要字段有对应的get/set方法对(注意是成对出现,只有其中一个不会发生映射),不需要使用@XmlElement注解,不论该方法的访问权限是什么(即使是private),jaxb就会将该字段映射成xml元素。不过最好加上@XmlElement注解,get/set方法任选一个即可,都加上会报错。
    2.若在一个字段有set/get方法对但又在字段上添加@XmlElement注解会报属性重复的错误。
    3.若没有set/get方法对,则需要在字段上使用@XmlElement注解才可以映射为xml元素,否则不会发生映射。
    4.若get/set方法上使用了@XmlTransient注解,但想要对应字段发生映射,需要在对应字段上添加@XmlElement注解,此时不会报错,并将该字段映射为xml元素。

  • XmlAccessType.FIELD(一般就是这个)
    1.每个非静态的字段(无论访问权限如何)都会被jaxb映射为xml元素,即使没有get/set方法对,即使没有使用@XmlElement元素,但最好加上该注解以表明该字段要被映射为xml元素。
    2.虽然没有get/set方法对,也会发生映射,但加上get/set方法对也不会报错,因为我们经常会使用这两个方法。但注意,不能再在这两个方法上使用@XmlElement方法,否则会报属性重复的错误。
    3.若在字段上使用了@XmlTransient注解,但还想让该字段发生映射,需要在该字段对应的get/set方法上添加@XmlElement

  • XmlAccessType.PUBLIC_MEMBER (该值为默认值)
    1.每个访问权限为public的字段,或者每个访问权限为public的get/set方法对,都会将字段映射为xml元素,即使不使用@XmlElement,但最好加上。不可同时存在public字段和对应的get/set方法对,不然会报属性重复的错误。
    2.若使用@XmlElement注解,需要注意只能在字段或get/set方法添加,两者任选其一,否则会报属性重复的错误。
    3.若字段不为public,get/set方法为public并使用了@XmlTransient,需要在字段上添加@XmlElement才会发生映射。
    若字段为public并使用了@XmlTransient,get/set方法对不为public,需要在get/set方法上使用@XmlElement才会映射。

  • XmlAccessType.NONE
    任何字段,get/set方法对都不会发生映射,除非使用某些注解。
    如@XmlElement,@XmlElementWrapper等。

  • @XmlAccessorOrder

@Inherited @Retention(RUNTIME) @Target({PACKAGE, TYPE})
public @interface XmlAccessorOrder {
        XmlAccessOrder value() default XmlAccessOrder.UNDEFINED;
}

包和类级别的注解。控制生成元素的顺序。
只有一个value属性,可取的值是一个名为XmlAccessOrder的枚举类型的两个值:
XmlAccessOrder.ALPHABETICAL :按照字母表的顺序对生成的元素排序。
XmlAccessOrder.UNDEFINED(默认):按照类中字段的顺序生成元素的顺序。

  • @XmlElementWrapper

 @Retention(RUNTIME) @Target({FIELD, METHOD})
 public @interface XmlElementWrapper {
   //包装标签名
    String name() default "##default";
   //包装标签命名空间
    String namespace() default "##default";
   //指定元素的文本值是否可以为空,默认为false。
    boolean nillable() default false;
   //是否必需
    boolean required() default false;
}

字段和方法级别的注解。围绕被映射的xml元素生成包装元素。主要用在集合对象映射后生成包装映射结果的xml元素。 一般用在集合字段上。

  • @XmlJavaTypeAdapter

@Retention(RUNTIME) @Target({PACKAGE,FIELD,METHOD,TYPE,PARAMETER})
public @interface XmlJavaTypeAdapter {
   //自定义的适配器类.class
    Class<? extends XmlAdapter> value();

    Class type() default DEFAULT.class;

    static final class DEFAULT {}

}

包、类、字段,方法、参数级别的注解。解决java日期(Date),数字(Number)格式化问题。
该注解的用法就是自定义适配器并继承XmlAdapter类,实现里面的marshal和unmarshal方法,并在该注解上引用。

  • @XmlValue

@Retention(RUNTIME) @Target({FIELD, METHOD})
public @interface XmlValue {}

字段和方法级别的注解。该注解的作用,简单理解就是定义xml元素文本值的类型,例如在一个类的String类型字段上使用该注解,则生成的元素文本值类型就是xsd:string,也就是定义一个xsd中的simpleType.若类中还有一个字段并使用了@XmlAttribute注解,则是定义一个xsd中的complexType。

  • @XmlType

@Retention(RUNTIME) @Target({TYPE})
public @interface XmlType {

    String name() default "##default" ;

    String[] propOrder() default {""};

    String namespace() default "##default" ;

    Class factoryClass() default DEFAULT.class;

    static final class DEFAULT {}

    String factoryMethod() default "";
}

类级别的注解。该注解有些复杂,主要使用的是它的propOrder属性,简单来说是用来定义xsd中的simpleType或complexType,从生成的xml中来看,它的作用就是指定生成元素的顺序,具体看下图:

简单解释下每行什么意思:

  • 若指定该注解的propOrder为{},会生成ComplexType并且使用xs:all指示器,表示所有被映射的元素都必须出现在xml中

  • 若propOrder的值为{“name”, “addr”, “area”}(大括号中都是Person类的字段名称),会生成ComplexType并使用xs:sequence指示器,表示生成的xml元素必须按照propOrder指定的顺序出现,也就间接实现了排序。

  • 若不指定propOrder属性(这与指定propOrder但值为{}不同),没有字段,会生成ComplexType并包含一个空的xs:sequence指示器。

  • 若不指定propOrder属性,但含有被@XmlValue注解的字段和被@XmlAttribute注解的字段,会生成一个含有simpleContent的ComplexType。

  • 若不指定propOrder属性,但含有被@XmlValue注解的字段而没有被@XmlAttribute注解的字段,会生成一个含有simpleType的ComplexType。

更多注解可以看此博客,很全很细:[http://doc.okbase.net/234390216/archive/296027.html]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值