`
Josh_Persistence
  • 浏览: 1651622 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

JAXB学习 (四)JAXBContext

阅读更多

在jaxb应用中,JAXBContext类可以说是使用JAXB API的入口点,就像是一道门,只有通过它才能进入到jaxb的世界里。

 

 

 

JAXBContext类提供的功能主要有:

 

  • marshall
  • unmarshall
  • validate

 

在jaxb中,通常如果声明JAXBContext对象:

JAXBContext jaxbContext = JAXBContext.newInstance("com.liulutu.student.model");

 

不过如果稍稍研究一下 JAXBContext 类,就会发现,其实它是一个抽象类, 但是从源码里却不能很清楚的看到到底是哪个实现类被具体的用到。

 

 

 

那么在 JAXBContext.newInstance("com.liulutu.student.model") 的背后肯定有一些猫腻。下面就简单介绍一下这背后所隐藏的秘密。

一、代码追踪

 

 首先看一下JAXBContext.newInstance("com.liulutu.student.model") 它的调用关系图:

 

可以看到,它一直调到了javax.xml.bind.ContextFinder类的find()方法

    ContextFinder.find(  
                            /* The default property name according to the JAXB spec */  
                            JAXB_CONTEXT_FACTORY,  
      
                            /* the context path supplied by the client app */  
                            contextPath,  
      
                            /* class loader to be used */  
                            classLoader,  
                            properties );  
     

中这里的 contextPath 就是传入的包名,如上的 com.liulutu.student.model ; JAXB_CONTEXT_FACTORY 是一个预定义的值 javax.xml.bind.context.factory 。

 

 

KEY: 在ContextFinder的find方法里,它首先会去找一个东西:jaxb.properties 。它会试图在你传入的包中去查找有没有一个名为 jaxb.properties 的properties文件;如果有,则会继续深入,看看有没有key值为传入的 factoryId ,在这里也就是值为 JAXB_CONTEXT_FACTORY 的key值,如果有,则把它对应的 value 认为是需要的 JAXBContext的factory的实现,会自动调它的 createContext 文件。

 

 

 

OTHER: 否则就会去查找 系统属性;再查找类路径上的META-INF/services/目录;最后再不行就反正一个默认的实现 /jaxb/src/com/sun/xml/internal/bind/v2/ContextFactory.java 。不过这些事情我不再关心了。

 

 

 

回过头看KEY部分。由此我们可以想到,如果要指定自定义的JAXBContext的实现,只需要在包下提供一 个jaxb.properties文件;文件里有一条key为 javax.xml.bind.context.factory , 值指定一个包含有 createContext()方法 并且该方法的返回值是一个JAXBContext 对象的类。

 

 

 

二、实践

 

可以简单实践一下,例如我在包 com.liulutu.student.model 下新建一个文件 jaxb.properties,内容如下:

 

 

 

Java代码 
    javax.xml.bind.context.factory=com.liulutu.student.model.CustomJAXBContextFactory  
     

 然后,在CustomJAXBContextFactory类里什么也不实现:

    package com.liulutu.student.model;  
      
    import javax.xml.bind.JAXBContext;  
      
    public class CustomJAXBContextFactory{  
      
    }  
     

 

然后再测试一下marshall或unmarshall的代码,例如:

 

JAXBContext jaxbContext = JAXBContext.newInstance("com.liulutu.student.model");  
  
ObjectFactory factory = new ObjectFactory();  
Students students = factory.createStudents();  
addNewStudentTo(factory, students, "a", SexType.MALE);  
addNewStudentTo(factory, students, "b", SexType.FEMALE);  
Marshaller marshaller = jaxbContext.createMarshaller();  
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);  
marshaller.setSchema(SchemaFactory.newInstance(  
        XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(  
        new File("students.xsd")));  
marshaller.marshal(students, new File("a.xml")); 

 

 然后检查一下运行结果:

 

    Exception in thread "main" javax.xml.bind.JAXBException: Provider com.liulutu.student.model.CustomJAXBContextFactory could not be instantiated: java.lang.NoSuchMethodException: com.liulutu.student.model.CustomJAXBContextFactory.createContext(java.lang.String, java.lang.ClassLoader)    
     - with linked exception:  
    [java.lang.NoSuchMethodException: com.liulutu.student.model.CustomJAXBContextFactory.createContext(java.lang.String, java.lang.ClassLoader)]  
        at javax.xml.bind.ContextFinder.newInstance(Unknown Source)  
        at javax.xml.bind.ContextFinder.find(Unknown Source)  
        at javax.xml.bind.JAXBContext.newInstance(Unknown Source)  
        at javax.xml.bind.JAXBContext.newInstance(Unknown Source)  
        at javax.xml.bind.JAXBContext.newInstance(Unknown Source)  
        at com.liulutu.student.test.TestMarshaller.main(TestMarshaller.java:22)  
    Caused by: java.lang.NoSuchMethodException: com.liulutu.student.model.CustomJAXBContextFactory.createContext(java.lang.String, java.lang.ClassLoader)  
        at java.lang.Class.getMethod(Unknown Source)  
        ... 6 more  
     

 

 

分享到:
评论

相关推荐

    JAXB乱码问题解决

    在Java开发中,JAXB(Java Architecture for XML Binding)是一个用于将XML文档和Java对象之间进行绑定的技术。在处理XML文件时,特别是涉及到序列化和反序列化时,可能会遇到字符编码问题,即所谓的“乱码”。这个...

    java学习之jaxb的学习一

    四、JAXB注解 JAXB提供了一系列注解,如@XmlRootElement、@XmlElement、@XmlAttribute等,用于自定义XML和Java对象之间的映射关系。通过注解,开发者可以更精确地控制XML的生成和解析。 五、JAXB与XML Schema XML ...

    JAXB 利用xsd文件生成java类

    JAXB (Java Architecture for XML Binding) 是Java平台上的一个标准,用于将XML文档与Java对象之间进行绑定,实现XML数据的解析和序列化。在Java开发中,JAXB提供了一种方便的方式,允许开发者通过XML Schema (XSD) ...

    JAXB技术实现xml与java对象互相转化代码教程

    使用java jdk的JAXB技术实现xml与java对象互相转化...•JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。 •Marshaller接口,将Java对象序列化为XML数据。 •Unmarshaller接口,将XML数据反序列化为Java对象。

    jaxb学习资料

    ### jaxb学习资料知识点详解 #### 一、JAXB概览 JAXB,全称为Java Architecture for XML Binding,是一种用于处理XML数据的Java API。它允许开发者将Java类与XML文档之间的转换过程自动化,从而简化了数据交换的...

    JaxbContext生成xml文件或java类对象转化注解

    JAXBContext 生成 XML 文件或 Java 类对象转换注解 JAXB(Java API for XML Binding)是一种将 Java 对象与 XML 进行转换的技术。JAXB 提供了一个快速便捷的方式将 Java 对象与 XML 进行转换。在 JAX-WS(Java 的 ...

    JAVA JAXB 解析XML嵌套子节点为字符串

    在Java开发中,JAXB(Java Architecture for XML Binding)是一个标准的API,用于将XML文档与Java对象之间进行互相转换。这个技术对于处理XML数据,尤其是解析和生成XML文档非常有用。当我们面临XML文档中存在嵌套子...

    JAXB学习笔记

    JAXB(Java Architecture for XML Binding)是Java平台上的一项标准技术,用于在XML和Java对象之间进行绑定,从而实现XML文档和Java对象之间的自动转换。它提供了方便的数据交换方式,简化了XML处理,使得开发者可以...

    JAXB 学习笔记

    **JAXB(Java Architecture for XML Binding)学习笔记** JAXB是Java平台标准版(Java SE)的一部分,它提供了一种方便的方式来将XML数据绑定到Java对象上,以及将Java对象转换为XML数据。这个强大的工具使得开发...

    jaxb-api jaxb-impl jar

    它提供了必要的接口和类,如`javax.xml.bind.JAXBContext`, `Unmarshaller`, `Unmarshaller`, 和 `Validator`等,用于实现XML到Java对象的编组(marshalling)和反编组(unmarshalling)。API本身不包含具体的实现,...

    jaxb解析生成xml

    // 创建JAXBContext,它是整个JAXB框架的核心 JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); // 创建Unmarshaller,用于从XML到Java对象的转换 Unmarshaller unmarshaller = jaxbContext....

    idea 中用jaxb 读xml中数据

    当我们需要处理XML文件,比如从XML中提取数据时,JAXB(Java Architecture for XML Binding)是一个强大的工具。本教程将详细解释如何在Idea中利用JAXB来读取XML文件中的数据。 JAXB是Java标准API,它提供了将Java...

    JAXB的HelloWorld源码

    总结来说,JAXB是Java中处理XML的强大工具,通过学习JAXB的HelloWorld源码,新手可以快速上手,理解XML和Java对象之间的绑定,以及如何进行序列化和反序列化操作。随着对JAXB的深入理解和实践,开发人员能够更高效地...

    JAXBContext测试Java对象与xml的相互转换Demo

    在Java世界中,Java Architecture for XML Binding (JAXB) 是一个强大的工具,它允许开发者将Java...通过深入学习和实践JAXBContext的使用,开发者可以更好地掌握Java与XML之间的交互,提升代码的可读性和可维护性。

    JAXB的例子

    **JAXB简介** Java Architecture for XML Binding (JAXB) 是Java平台上的一个重要标准,它提供了一种机制,能够将XML文档与Java...通过学习和掌握JAXB,开发者能够更加高效地处理XML数据,提升项目的开发效率和质量。

    jaxb 使用实例

    2. **设置JAXB上下文**:使用`JAXBContext`来获取Java类型和XML之间的映射信息。这一步通常需要传递Java类的Class对象作为参数。 3. **序列化(Marshalling)**:创建`Marshaller`实例,并调用其`marshal()`方法将...

    android上使用 jaxb所需要的包

    1. `jaxb-api-2.2.7.jar`:这是JAXB的主要API,提供了基本的接口和类,如`javax.xml.bind.JAXBContext`和`javax.xml.bind.Marshaller`,用于实现XML和Java对象的转换。`JAXBContext`是整个转换过程的核心,负责创建...

    jaxb api jar

    接着,可以使用`JAXBContext`来创建一个上下文,该上下文知道如何处理这些Java类。之后,`Marshaller`对象用于将Java对象序列化为XML,而`Unmarshaller`则用于从XML文档反序列化回Java对象。 在实际应用中,JAXB...

    jaxb (XML操作)

    2. **设置上下文(Context)**:使用`JAXBContext`类创建一个JAXB上下文,它包含了所有需要被转换的Java类的信息。 3. **反序列化(Unmarshalling)**:使用`Unmarshaller.unmarshal()`方法将XML数据转换为Java对象...

    jaxb-api jaxb-impl jaxb-xjc jaxws-rt jar包

    比如`javax.xml.bind.JAXBContext`,它是整个JAXB框架的核心,负责创建上下文,解析XML到Java对象,或者将Java对象序列化成XML。`Unmarshaller`和`Marshaller`接口分别用于XML到Java对象的反序列化和Java对象到XML的...

Global site tag (gtag.js) - Google Analytics