`
huttoncs
  • 浏览: 199119 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JAXB基本使用

    博客分类:
  • java
 
阅读更多

本文主要参考了http://www.cnblogs.com/lzrabbit/p/3657854.html

JAXB主要用来实现对象和XML之间的序列化和反序列化,关于JAXB的介绍就不多说了,网上一搜一大把,这里主要总结下基本使用方法和一些注意事项

首先定义两个示例类ClassA,ClassB,用于后续的示例演示

 

package com.hutton.client.vo;

import javax.xml.bind.annotation.XmlAccessOrder;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorOrder;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

/**
 * @XmlAccessorOrder用于对java对象生成的xml元素进行排序。它有两个属性值:
 * AccessorOrder.ALPHABETICAL:对生成的xml元素按字母书序排序
 * XmlAccessOrder.UNDEFINED:不排序
 * @XmlType用在class类的注解,常与@XmlRootElement,@XmlAccessorType一起使用。它有三个属性:name、propOrder、namespace,经常使用的只有前两个属性
 * 在使用@XmlType的propOrder 属性时,必须列出JavaBean对象中的所有属性,否则会报错
 * */

@XmlRootElement(name="ClassA")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
     "classB",
     "classAName",
     "type"
 })
//@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class ClassA {
 private String type;
 @XmlAttribute(name="id")
    private int classAId;
    private String classAName;

    private ClassB classB;
   
   

    public int getClassAId() {
        return classAId;
    }

    public void setClassAId(int classAId) {
        this.classAId = classAId;
    }

    public String getClassAName() {
        return classAName;
    }

    public void setClassAName(String classAName) {
        this.classAName = classAName;
    }

    public ClassB getClassB() {
        return classB;
    }

    public void setClassB(ClassB classB) {
        this.classB = classB;
    }

 public String getType() {
  return type;
 }

 public void setType(String type) {
  this.type = type;
 }
   
}
 package com.hutton.client.vo;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class ClassB {
    private int classBId;
    private String classBName;

    public int getClassBId() {
        return classBId;
    }

    @XmlAttribute(name="id")
    public void setClassBId(int classBId) {
        this.classBId = classBId;
    }

    public String getClassBName() {
        return classBName;
    }

    public void setClassBName(String classBName) {
        this.classBName = classBName;
    }
}


用于序列化的XmlUtil

 

package com.hutton.client.utils;

import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class XmlUtil {

    public static String toXML(Object obj) {
        try {
            JAXBContext context = JAXBContext.newInstance(obj.getClass());

            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// //编码格式
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 是否省略xm头声明信息
            StringWriter writer = new StringWriter();
            marshaller.marshal(obj, writer);
            return writer.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @SuppressWarnings("unchecked")
    public static <T> T fromXML(String xml, Class<T> valueType) {
        try {
            JAXBContext context = JAXBContext.newInstance(valueType);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            return (T) unmarshaller.unmarshal(new StringReader(xml));
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    }
}
调用如下:

package docment.jaxb;

import com.hutton.client.utils.XmlUtil;
import com.hutton.client.vo.ClassA;
import com.hutton.client.vo.ClassB;

public class XmlUtilTest {

 public static void main(String[] args) {
  ClassB classB = new ClassB();
        classB.setClassBId(22);
        classB.setClassBName("B2");

        ClassA classA = new ClassA();
        classA.setClassAId(11);
        classA.setClassAName("A1");
        classA.setClassB(classB);
        classA.setType("test");
        System.out.println(XmlUtil.toXML(classA));
 }

}

 

运行结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ClassA id="11">
    <classB id="22">
        <classBName>B2</classBName>
    </classB>
    <classAName>A1</classAName>
    <type>test</type>
</ClassA>

 

 

这里要注意以下几点

  1. 要序列化的类加上 @XmlRootElement注解,否则会报错(错误提示很清晰,这里就不贴出来了)
  2. JAXB序列化XML时  默认序列化getter和setter,且getter和setter必须成对出现才会被序列化

   3. 属性名称,默认序列化出来的类和属性名称默认是首字母转换为小写,若需要控制属性名称需要在getter或setter上使用 @XmlElement(name="ClassAId") 指定名称,这里要注意的是@XmlElement放置在getter或setter上都行,但只能放一个,也就是说不能同时在getter和setter上使用@XmlElement注解;也可以为每个属性设置@XmlElement(name=""),这里的name就是生成的XML中的节点名

  4. 如何控制根节点名称?
   使用@XmlRootElement指定name属性即可,如@XmlRootElement(name="ClassA")

 5. 怎么添加命名空间
使用@XmlRootElement(namespace="cn.lzrabbit") 指定namespace属性

 

 

下面摘录了一些对常用注解的描述

一.Jaxb处理java对象和xml之间转换常用的annotation有:

  1. @XmlType
  2. @XmlElement
  3. @XmlRootElement
  4. @XmlAttribute
  5. @XmlAccessorType
  6. @XmlAccessorOrder
  7. @XmlTransient
  8. @XmlJavaTypeAdapter

二.常用annotation使用说明

  1. @XmlType

  @XmlType用在class类的注解,常与@XmlRootElement,@XmlAccessorType一起使用。它有三个属性:name、propOrder、namespace,经常使用的只有前两个属性。如:

@XmlType(name = "basicStruct", propOrder = {
    "intValue",
    "stringArray",
    "stringValue"
)
在使用@XmlType的propOrder 属性时,必须列出JavaBean对象中的所有属性,否则会报错。

  2.@XmlElement

  @XmlElement将Java对象的属性映射为xml的节点,在使用@XmlElement时,可通过name属性改变java对象属性在xml中显示的名称。如:

  @XmlElement(name="Address")  
  private String yourAddress;

  3.@XmlRootElement

  @XmlRootElement用于类级别的注解,对应xml的跟元素,常与 @XmlType 和 @XmlAccessorType一起使用。如:

  @XmlType
  @XmlAccessorType(XmlAccessType.FIELD)
  @XmlRootElement
  public class Address {}

  4.@XmlAttribute

  @XmlAttribute用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。如:
  @XmlAttribute(name="Country")
  private String state;

  5.@XmlAccessorType

  @XmlAccessorType用于指定由java对象生成xml文件时对java对象属性的访问方式。常与@XmlRootElement、@XmlType一起使用。它的属性值是XmlAccessType的4个枚举值,分   别为:

  XmlAccessType.FIELD:java对象中的所有成员变量

  XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量

  XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量

  XmlAccessType.NONE:java对象的所有属性都不映射为xml的元素

  注意:@XmlAccessorType的默认访问级别是XmlAccessType.PUBLIC_MEMBER,因此,如果java对象中的private成员变量设置了public权限的getter/setter方法,就不要在   private变量上使用@XmlElement和@XmlAttribute注解,否则在由java对象生成xml时会报同一个属性在java类里存在两次的错误。同理,如果@XmlAccessorType的访问权限   为XmlAccessType.NONE,如果在java的成员变量上使用了@XmlElement或@XmlAttribute注解,这些成员变量依然可以映射到xml文件。

  6.@XmlAccessorOrder

  @XmlAccessorOrder用于对java对象生成的xml元素进行排序。它有两个属性值:

  AccessorOrder.ALPHABETICAL:对生成的xml元素按字母书序排序

  XmlAccessOrder.UNDEFINED:不排序

  7.@XmlTransient

  @XmlTransient用于标示在由java对象映射xml时,忽略此属性。即,在生成的xml文件中不出现此元素。

  8.@XmlJavaTypeAdapter

  @XmlJavaTypeAdapter常用在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,需要自己写一个adapter类继承XmlAdapter抽象类,并实现里面的方法。

  @XmlJavaTypeAdapter(value=xxx.class),value为自己定义的adapter类

  XmlAdapter如下:

public abstract class XmlAdapter<ValueType,BoundType> {
    // Do-nothing constructor for the derived classes.
    protected XmlAdapter() {}
    // Convert a value type to a bound type.
    public abstract BoundType unmarshal(ValueType v);
    // Convert a bound type to a value type.
    public abstract ValueType marshal(BoundType v);
 }

 

 

分享到:
评论

相关推荐

    jaxb.zip_jaxb

    jaxb2中marshall与unmarshall的基本使用

    java使用jaxb操作xml示例

    JAXB主要用来实现对象和XML之间的序列化和反序列化,关于JAXB的介绍就不多说了,这里主要总结下基本使用方法和一些注意事项

    XML JAXB入门示例

    很好的jaxb入门示例 把所有注解标签都试一遍基本就OK了

    jOVAL:用于SCAP规范格式的开源JAXB数据模型

    Joval:trade_mark:开源数据模型 jOVAL是用于SCAP规范语言的开源JAXB数据模型,包括: XCCDF 椭圆形 ... 设置一个指向JDK基本目录的JAVA_HOME环境变量集。 该项目需要Java 6或更高版本。 使用Java 6时

    JAXBElementDefaultValueResolver:可用于为JAXB对象设置元素默认值的类

    有一个默认值插件,可以为基本类型(例如Boolean,Integer,String和Enums)设置默认值: : 但是,如果您需要映射其他类型的元素值,例如BigDecimal,则上述插件将不起作用。 因此,我创建了这个Spring bean,可...

    JiBx开发入门指南

    而JiBx使用java字节码enhance技术,不像jaxb等更多在于源代码生成技术。JiB的工作主要在于前期,也就是进行字节码绑定,这一部分基本上都是在编译器完成的。在运行期,不需要任何的配置,由于字节码已经嵌入java类中...

    WEBservice实战开发视频教程

    wsdl和soap讲解(介入了tcpmon工具)04_SOA的分析(纯属扯淡)05_dtd讲解06_schema的命名空间07_schema的元素和属性的定义08_schema的语法和建议的编写方式09_使用jaxb完成对象和xml的转换10_Stax的基本操作(基 ...

    Java SE实践教程 源代码 下载

    Java SE实践教程 源代码 2010-9-...13.2.1 建立CVS的使用环境和基本操作 360 13.2.2 使用标记和分支 373 13.3 使用UML建模 376 13.3.1 对基本结构建模 376 13.3.2 对高级结构建模 381 13.4 小结 387 索引... 389

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    感谢大家的支持,我终于升级了,上传限制得到...13.2.1 建立CVS的使用环境和基本操作 360 13.2.2 使用标记和分支 373 13.3 使用UML建模 376 13.3.1 对基本结构建模 376 13.3.2 对高级结构建模 381 13.4 小结 387

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    感谢大家的支持,我终于升级了,上传限制得到...13.2.1 建立CVS的使用环境和基本操作 360 13.2.2 使用标记和分支 373 13.3 使用UML建模 376 13.3.1 对基本结构建模 376 13.3.2 对高级结构建模 381 13.4 小结 387

    spring加载restful(文档+程序源码)

    spring加载restful(文档+程序源码) ...然后我们再完成一个更复杂的应用来了解Spring 3 REST支持的重要概念,如多种MIME类型表示支持和JAXB支持。另外,本文还使用一些代码片断来帮助理解这些概念。

    JPAJava8Sorting

    项目内容 ...#Model 基本上为 JAXB 和 JPA 使用建模了 Folder 和 Document 之间的 1:n 关系: ##class 文件夹 字符串名称 文件文件 ##class 文档 字符串名称 文件夹父文件夹 ##表格 ###文档+-----------

    Spring.3.x企业应用开发实战(完整版).part2

    14.3.1 JAXB 14.3.2 XMLBeans 14.3.3 Castor 14.3.4 JiBX 14.3.5 总结比较 14.4 与Spring OXM整合 14.4.1 Spring OXM概述 14.4.2 整合OXM实现者 14.4.3 如何在Spring中进行配置 14.4.4 Spring OXM 简单实例 14.5 小...

    Spring3.x企业应用开发实战(完整版) part1

    14.3.1 JAXB 14.3.2 XMLBeans 14.3.3 Castor 14.3.4 JiBX 14.3.5 总结比较 14.4 与Spring OXM整合 14.4.1 Spring OXM概述 14.4.2 整合OXM实现者 14.4.3 如何在Spring中进行配置 14.4.4 Spring OXM 简单实例 14.5 小...

    curso_webservices_20150601:网络服务课程

    网络服务课程 ... JAXB-WS - 使用@WebMethod 强制使用字段 模拟不是存根 SOA (参见原则) SAAJ MTOM http://en.wikipedia.org/wiki/Message_Transmission_Optimization_Mechanism SAAJ 与 MTO

    从Java走向Java+EE+.rar

    4.6 Java EE中的JAXB 55 4.7 小结 64 第5章 使用Java Servlet开发动态网页 65 5.1 Servlet的概念和生命周期 65 5.2 如何编写Servlet 67 5.3 使用Eclipse和Tomcat开发Servlet实例——输出字符串响应 72 ...

    basejava:居鲁士(Cyrus)

    该应用程序将从第一堂课开始,根据课程的基本主题进行开发:对象模型,集合,I / O系统,使用文件,序列化,使用XML,JSON,SQL,对数据库的持久性(PostgreSQL ),servlet,HTML / JSP / JSTL,Tomcat Web容器,...

    fhir-java:HL7 FHIR Java 实现

    HL7 FHIR Java 实现使用 JAXB Java Bean 生成、动态扩展类型和未装箱基本类型的 HL7 FHIR Java 实现。

    JAVA_API1.6文档(中文)

    javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的...

    xml-processor-example:JavaFX应用程序实现示例XML处理应用程序

    xml处理器示例 JavaFX应用程序实现示例XML处理应用程序 主要功能: 使用JAXB的XML对象绑定 基本的CRUD操作 XML模式验证 XML到PDF的转换

Global site tag (gtag.js) - Google Analytics