XmlRootElement

作用是 java对象 <---> xml文件   之间的转换

JAXB Annotation

@XmlRootElement   // xml 文件的根元素

@XmlElement

@XmlAccessorType  // 表明类内,什么样的成员 是 可以被xml 转化 传输的  可以是 FIELD PROPERTY ...

@XmlTransient

@XmlJavaTypeAdaptor

=========================================

下面是一个例子:

Boy.java

package jaxb;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlAccessType;

@XmlRootElement // 必须要标明这个元素
@XmlAccessorType(XmlAccessType.FIELD)
public class Boy {    
    String name = "CY";
}

JAXBTest.java

package jaxb;

import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class JAXBTest {

public static void main(String[] args) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(Boy.class);
        
        Marshaller marshaller = context.createMarshaller();
        Unmarshaller unmarshaller = context.createUnmarshaller();
        
        Boy boy = new Boy();
        marshaller.marshal(boy, System.out);
        System.out.println();
        
        String xml = "<boy><name>David</name></boy>";
        Boy boy2 = (Boy) unmarshaller.unmarshal(new StringReader(xml));
        System.out.println(boy2.name);
    }
}

下面是运行结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><boy><name>CY</name></boy>
David
先是marshall成 xml文件,

再是把 xml 文件 unmarshal 成 java object。

--------------------------------------------------

改动一:

@XmlAccessorType(XmlAccessType.FIELD)  --> @XmlAccessorType(XmlAccessType.PROPERTY)

意思是 只有 属性 才能被转换成 xml 中的标签。

所以再运行的结果是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><boy/>
CY

就是说 java object 转换成 xml 的时候,name 不是属性(因为没有 get set方法),所以name不转换成标签。

-----------------------------------------------------

改动二:

在 改动一 的基础上,给name属性添加 get set 方法。 再运行,结果为:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><boy><name>CY</name></boy>
David
由此 可见 @XmlAccessorType 这个annotation 的作用。

-----------------------------------------------------

改动三:

改动二 的基础上,给Boy 再添加一个field, int age=10, 即:

package jaxb;

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

@XmlRootElement 
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Boy {    
    String name = "CY";
    int age = 10; 
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

显然,这个age 是不会被 转化 到xml 文件中的。解决办法是:

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

@XmlRootElement // bixude 
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Boy {
    
    String name = "CY";
    @XmlElement
    int age = 10;
 
    public String getName() {
        return name;
    }

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

}

加上 @XmlElement annotation. 运行结果为:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><boy><age>10</age> <name>CY</name></boy>
David

--------------------------------------

对于根元素,可以设置属性:

@XmlRootElement(name="b" nameSpace="http://test")

这样,在生成的xml文件中,<boy> 标签 就会变为 <b> 标签。并且加上一个命名空间。

----------------------------------------

下面解释 @XmlJavaTypeAdaptor 的作用。

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Boy {
    
    private String name = "CY";

private Address address; // 是一个接口
    
    public String getName() {
        return name;
    }

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

}

在 java object 转换成 xml 的时候,接口Address 无法被转换。

所以 这里要加上 @XmlJavaTypeAdapter(AddressAdapter.class)

所以 要多写一个AddressAdaptor 类。

这个类会返回Address接口的一个具体实现类的对象。

这 就是 @XmlJavaTypeAdapter 的作用。

时间: 2024-08-01 17:39:28

XmlRootElement的相关文章

【转-整理】 JAXB注解 @XmlRootElement 及XML文件解析详解

Java代码   @Retention(value=RUNTIME) @Target(value=TYPE) public @interface XmlRootElement @Inherited @Retention(value=RUNTIME) @Target(value={PACKAGE,TYPE}) public @interface XmlAccessorType XmlRootElement: 将类或枚举类型映射到 XML 元素.JAXB中的注解,用来根据java类生成xml内容.

JAXB - Annotations, Top-level Elements: XmlRootElement

A class that describes an XML element that is to be a top-level element, i.e., one that can function as an XML document, should be annotated with XmlRootElement. Its optional elements are name and namespace. By default, the class name is used as the

XmlRootElement JAXB

http://desert3.iteye.com/blog/1570092(文章已经很好) 看了那边文章以后尝试后写点直白的 PROPERTY: JAXB 绑定类中的每个获取方法/设置方法对将会自动绑定到 XML,除非由 XmlTransient 注释. 只有set和get方法才会拿到.没有set和get的话是取不到的 FIELD :JAXB 绑定类中的每个非静态.非瞬态字段将会自动绑定到 XML,除非由 XmlTransient 注释.(@XmlElement 用这个才行不是,,楼主XmlTr

笔记:Jersey REST 传输格式-JSON

JSON 类型已经成为Ajax技术中数据传输的实际标准,Jersey 提供了多种处理JSON数据的包和解析方式,下表展示了JSON包和解析方式: 解析方式\JSON支持包 MOXy JSON-P Jackson 基于POJO的JSON绑定 是 否 是 基于JAXB的JSON绑定 是 否 是 低级的(逐字的)JSON解析和处理 否 是 否 使用 MOXy 处理JSON MOXy 是 EclipseLink项目的一个模块,是使用JAXB和SDO作为XML绑定的技术基础,实现了JSR222标准(JAX

CXF+Spring+JAXB+Json构建Restful服务

话不多说,先看具体的例子: 文件目录结构: web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://

【Apache CXF】CXF对JAX-RS的支持

用CXF构建RESTful services有两种方式:·CXF对JAX-RS的实现.·使用JAX-WS Provider/Dispatch API.官网上还有Http Bindings方式,他需要做一些繁琐的工作去创建资源再映射到服务上,这种方式从2.6时已经被移除了.刚好我这里有几个工程都是用第一种方式实现的,在这里便主要记录一下spring+CXF构建RESTful service. 首先列举一下JAX-RS的一些常用注解.·@Path:指定资源的URI.·@Produces/@Consu

java webservice

1.1 [什么是webservice] 1.1.1 什么是webservice? l Web service 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术. l 采用标准SOAP(Simple Object Access Protocol)  协议传输,soap属于w3c标准.Soap协议是基于http的应用层协议,soap协议传输是xml数据. l 采用wsdl作为描述语言即webservice使用说明书,wsdl属w3c标准. l xml是webserv

&lt;转载&gt;在Jersey JAX-RS 处理泛型Collection

在Java中,从1.5开始,我们就可以使用泛型了(generic),这看上去很像C++ Template,但是实际上它们是不同的.在这里我不想过多的描述细节,你可以从Google上搜索一下. 但是,泛型已经变得如此复杂,以至于已经有500多页的 FAQ. 我们长话短说:泛型提供了编译时类型安全,所以也消除了类型转换的(cast)的需要.它是通过被称为类型消除(type erasure)的编译时技术来实现的. 泛型FAQ解释了所有的细节,对我来说它就是Java泛型的圣经.在有些情况下,我们需要从J

springmvc对于JSON对象的处理

1.常见的json    jar包,及其优缺点(开发中可以一起使用) json-lib     缺点:依赖第三方的包 jackson SpringMVC内置的json装换工具,依赖包较少 GSON    谷歌开源jar包,功能最强大,不依赖任何包 fastjson   阿里巴巴开源jar包,效率最高,不依赖任何报 2.在需要返回的方法前面加上     @ResponseBody注解 1 @RequestMapping(value = "/user/userview.html", met