本文主要参考了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>
这里要注意以下几点
- 要序列化的类加上 @XmlRootElement注解,否则会报错(错误提示很清晰,这里就不贴出来了)
- 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有:
- @XmlType
- @XmlElement
- @XmlRootElement
- @XmlAttribute
- @XmlAccessorType
- @XmlAccessorOrder
- @XmlTransient
- @XmlJavaTypeAdapter
二.常用annotation使用说明
-
@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中显示的名称。如:
3.@XmlRootElement
@XmlRootElement用于类级别的注解,对应xml的跟元素,常与 @XmlType 和 @XmlAccessorType一起使用。如:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Address {}
4.@XmlAttribute
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默认处理的仅是基本类型和String,对于自定义对象,需要使用注解进行映射。 - 对于大型项目,可能需要考虑性能问题,因为JAXB涉及大量的反射操作。 总之,JAXB为Java开发者提供了一种强大而便捷的方式来处理...
【JAXB基本使用示例】 以下代码展示了如何使用JAXB进行对象到XML的序列化和反序列化: ```java import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; // ...
### JAXB的基本概念 1. **Java类到XML Schema的映射**:通过`@XmlRootElement`和`@XmlElement`等注解,可以将Java类和其属性映射为XML元素和属性。例如,一个名为`Person`的类可以通过注解映射到一个XML文档的根...
对于IntelliJ IDEA,虽然内置了一些基本的JAXB支持,但也可以安装如"Java2WSDL"这样的插件来增强功能。 **JAXB的基本用法** - **生成Java类**:JAXB提供了一个工具`xjc`,可以将XML Schema文档转换为对应的Java类...
在这个"axis部署WebServices 和 JAXB的使用"主题中,我们将深入探讨这两个关键技术及其协同工作。 首先,让我们关注Axis的部署过程。Axis1.3是Axis的一个较旧版本,但仍然适用于许多遗留系统。部署Web服务的基本...
### JAXB的基本概念 1. **Java类到XML的映射(Marshalling)**:将Java对象转换为XML文档的过程称为Marshalling。JAXB通过`Marshaller`接口来实现这个功能,它提供了一系列方法将Java对象转换成XML格式的字符串或者...
1. `jaxb-api-2.2.7.jar`:这是JAXB的主要API,提供了基本的接口和类,如`javax.xml.bind.JAXBContext`和`javax.xml.bind.Marshaller`,用于实现XML和Java对象的转换。`JAXBContext`是整个转换过程的核心,负责创建...
JAXB (Java Architecture for XML Binding) 是Java平台上的一个标准,用于将XML文档与Java对象之间进行绑定,...在JAXB-Sunshine7这个示例中,可能包含了一个或多个关于如何使用JAXB从XSD生成Java类的演示和实践案例。
2. **实例化(Unmarshalling)**:当需要将XML数据转换为Java对象时,JAXB使用Unmarshaller接口解析XML文档,生成对应的Java对象。这个过程是将XML数据"反序列化"为可操作的Java对象。 3. **序列化(Marshalling)*...
5. **处理命名空间的jar包**:虽然JDK 1.6内置了基本的JAXB实现,但处理特定的命名空间或扩展功能可能需要额外的库,如`jaxb-api.jar`、`jaxb-impl.jar`和`javax.xml.bind.annotation.jar`等。这些jar包提供了完整的...
在本文中,我们将探讨JAXB的基本概念、使用场景以及如何通过一个简单的实例来入门。 ### JAXB的核心功能 1. **对象到XML的序列化**:JAXB能够将Java对象转换为XML文档,使得Java应用程序能够方便地生成XML输出。 2...
首先,我们需要了解JAXB的基本工作原理。JAXB通过元数据(如注解或XML绑定文件)来映射Java类到XML元素,以及XML元素到Java类。这使得XML文档能够被自动解析成Java对象,反之亦然。 **1. JAXB的使用步骤** (1) **...
**一、JAXB的基本概念** 1. **Java Bean**: Java Bean是Java中的一个简单对象,通常具有getter和setter方法,用于封装数据。在JAXB中,这些Bean类会被映射到XML元素和属性。 2. **XML Schema**: 定义了XML文档的...
4. **API支持**:`jaxb-impl.jar`包含JAXB的主要API,如`Unmarshaller`、`Marshaller`、`Binder`等接口,它们提供了XML和Java对象之间转换的基本操作。 **版本差异** 在提供的压缩包中,有两个不同版本的`jaxb-...
如果在你的项目中需要使用JAXB2来处理XML,你可以将这些jar添加到项目的类路径中,以确保所有必要的依赖都已到位。例如,在Maven或Gradle项目中,可以通过配置依赖管理来引用这些库。在传统的Java应用中,你可能需要...
三、JAXB的基本使用 1. 定义Java类:首先,我们需要定义一个Java类,该类的属性对应XML文档中的元素和属性。JAXB会自动为这些属性生成getter和setter方法。 2. 创建JAXBContext:这是JAXB的核心,负责管理和控制XML...
首先,我们需要了解JAXB的基本用法。JAXB的工作原理是基于Java类来生成XML schema,或者反过来基于XML schema生成Java类。当我们有一个XML文档,我们可以创建对应的Java类,这些类将作为映射的基础。然后,JAXB会...
2. 使用 JAXB 的 XJC 工具,通过定义 schema 的方式实现 Java 对象与 XML 的绑定。 ### 3.2 JAXB Annotation 使用说明 #### 3.2.1 @XmlType @XmlType 定义映射的一些规则,用在 class 类的注解,常与 @...
通过分析这个"JAXB.zip_jaxb"压缩包的内容,我们可以学习到如何在NetBeans中创建和管理一个JAXB项目,理解JAXB的基本原理和用法,以及如何利用Ant进行构建和测试。这不仅有助于加深对JAXB的理解,也能够提升在实际...