- 浏览: 987498 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
运乃强谦:
老哥,你确定这个wsdl 地址 可以访问?
[CXF] Server与Client实现方式五:HTTPS -
wangyudong:
由CXF实现的微服务需要有比较好的工具去测试RESTful A ...
[CXF] Server与Client实现方式四:JMS -
dengmiao:
JAXB学习三 (验证) -
panamera:
你好。可以提供maven pom配置是怎么配置的?不知道你使用 ...
[CXF] Server与Client实现方式四:JMS -
u010221220:
请问楼主一二三部分的代码都应该放在哪个函数体中。
使用JDI监听Java程序运行
在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,内容如下:
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
评论
发表评论
-
自定义Spring MVC中的数据绑定
2015-02-01 18:27 1489默认情况下,spring mvc的数据映射的实现是自动查找请 ... -
Java单例(Singleton)
2014-05-22 11:40 1903【译自:http://www.journaldev.com ... -
Java函数式编程学习二
2014-06-05 10:58 2665上一节里,介绍了一个函数接口: java.uti ... -
Java函数式编程学习一
2014-05-07 22:02 7339一、缺省方法 首先看一段用Java 8写的代码: ... -
快速排序的几种实现
2014-05-06 23:13 1677快速排序是最经典的 ... -
计算Fibonacci数列
2014-05-04 15:37 1657Fibonacci数列的定义如 ... -
(转)Java函数式编程系列文章
2014-04-11 16:52 745转载: Java函数式编程(一) Java函数式编程( ... -
Java中的动态代理
2014-04-02 15:11 2352在使用CXF的时候,尤其是创建针对REST或SOAP服务的 ... -
Java 7中的Path
2014-04-01 17:33 0package test; public ... -
HashMap对HashTable和ArrayList对Vector
2014-03-26 14:16 847有人面试总喜欢问比 ... -
Java国际化:BreakIterator
2014-03-21 11:51 2972【译自:http://tutorials.jenkov.c ... -
Java中使用StreamTokenizer
2014-03-21 09:44 3314按照Javadoc里的描述:StreamTokenizer ... -
Java中枚举的用法
2014-03-19 15:31 2797Java 5里新引用了枚举类型,这篇文章简单介绍一下它的基 ... -
Java线程类三
2014-03-06 11:18 1141一、Callable 最早创建线程要么是通过实现Runn ... -
Java线程类二
2014-03-05 14:21 1192一、java.util.concurrent.Exchan ... -
Java线程类一
2014-03-04 17:25 950一、java.util.concurrent.CountD ... -
基于Java的Dropbox文件操作
2014-01-22 11:15 4326Dropbox提供了基于各种类型的API和应用类型的开发工 ... -
使用特殊字符控制Console输出
2013-11-28 10:39 1061如果要在console上打印 Hello + 1到10,最简 ... -
控制JAXB的输入输出
2013-11-27 16:06 4137上一节介绍了如何在解析模型的时候构建模型之间的父子链,其实 ... -
JAXB中怎么构建对父对象的链接
2013-11-27 11:17 3593还是以在第一节介绍JAXB的schema为例: < ...
相关推荐
- 易于使用:Java API简单直观,易于理解和使用。 8. **JAXB的局限**: - 大型复杂的XML结构可能导致生成的Java类过于庞大且难以管理。 - 对性能敏感的应用可能需要更高效的XML处理方式,如DOM、SAX或StAX。 ...
### jaxb学习资料知识点详解 #### 一、JAXB概览 JAXB,全称为Java Architecture for XML Binding,是一种用于处理XML数据的Java API。它允许开发者将Java类与XML文档之间的转换过程自动化,从而简化了数据交换的...
1. **易用性**:JAXB提供了一种直观且易于理解的方式来处理XML,无需编写大量的DOM或SAX解析代码。 2. **性能**:由于JAXB是Java平台的标准部分,它通常比第三方库更快,因为它可以利用JVM的优化。 3. **自动类型...
在Java开发中,JAXB(Java Architecture for XML Binding)是一个标准的API,用于将XML文档与Java对象之间进行互相转换。这个技术对于处理XML数据,尤其是解析和生成XML文档非常有用。当我们面临XML文档中存在嵌套子...
这个Demo可以帮助我们理解JAXBContext如何工作,并演示了如何在实际项目中使用JAXB进行数据交换。 总结起来,JAXBContext是Java对象和XML之间转换的关键组件。通过创建JAXBContext实例,我们可以轻松地实现Java对象...
总结来说,JAXB是Java中处理XML的强大工具,通过学习JAXB的HelloWorld源码,新手可以快速上手,理解XML和Java对象之间的绑定,以及如何进行序列化和反序列化操作。随着对JAXB的深入理解和实践,开发人员能够更高效地...
它提供了必要的接口和类,如`javax.xml.bind.JAXBContext`, `Unmarshaller`, `Unmarshaller`, 和 `Validator`等,用于实现XML到Java对象的编组(marshalling)和反编组(unmarshalling)。API本身不包含具体的实现,...
**JAXB(Java Architecture for XML Binding)学习笔记** JAXB是Java平台标准版(Java SE)的一部分,它提供了一种方便的方式来将XML数据绑定到Java对象上,以及将Java对象转换为XML数据。这个强大的工具使得开发...
首先,我们需要理解JAXBContext的作用。JAXBContext是整个JAXB框架的核心,它负责生成解析和生成XML所需的所有元数据。通过这个上下文,我们可以创建Unmarshaller对象来解析XML到Java对象,或者创建Marshaller对象将...
使用JAXB,开发者首先需要定义Java类来表示XML结构,然后通过JAXB的`@XmlRootElement`和`@XmlElement`等注解来标注这些类,以便JAXB能够理解它们与XML元素的对应关系。接着,可以使用`JAXBContext`来创建一个上下文...
总之,学习JAXB不仅可以帮助你理解XML与Java之间的转换机制,还能提升你在开发中处理XML数据的能力。通过深入学习和实践,你将能够熟练运用JAXB进行XML的解析和编码,提高项目开发的效率和质量。
**Java Architecture for XML Binding (JAXB)** 是Java平台上的一个标准技术,用于在XML文档和Java对象之间进行数据绑定。...理解并熟练运用JAXB,对于处理XML数据的Java开发者来说,是一项重要的技能。
Java Architecture for XML Binding (JAXB) 是Java平台中用于处理XML和Java对象之间转换的一个标准API。它使得开发者能够方便地在Java对象和XML...在实际开发中,理解并掌握JAXB的使用对于处理XML相关的任务至关重要。
这一步骤将创建带有正确注解的Java类,以便JAXB理解XML结构。 (3) **实例化Java对象** 创建Java对象并填充数据。 (4) **XML序列化** 使用`JAXBContext`实例化一个marshaller对象,然后调用其`marshal()`方法将...
这个简单的例子将带你深入理解JAXB的基本用法,包括注解的使用和Java与XML之间的互相转换。 **一、JAXB的基本概念** 1. **Java对象到XML**: JAXB允许我们将Java对象直接序列化为XML格式的文档,这称为对象到XML的...
通过实践和学习,开发者可以充分利用JAXB的潜力,提高XML处理的效率和可维护性。在提供的压缩包文件`JAXB_tests`中,可能包含了一些示例代码和测试用例,这将有助于更深入地理解JAXB的工作机制和用法。
首先,我们需要理解JAXB的工作原理。JAXB允许我们将Java类映射到XML Schema,反之亦然。这意味着我们可以定义Java类来表示业务对象,然后JAXB会自动生成解析和序列化XML的代码。同样,当我们接收到XML数据时,JAXB也...
Java Architecture for XML Binding (JAXB) 是Java平台上的一个标准技术,用于在XML文档和Java对象之间进行数据绑定。它允许开发者将XML Schema...理解并掌握JAXB的使用,对于处理XML数据的Java开发人员来说至关重要。
理解并熟练使用JAXB,能够极大地提高开发效率并减少错误,使得Java应用与XML数据的交互变得更加简单和高效。在实际工作中,开发者可以根据项目需求和团队习惯选择是否采用JAXB,或者考虑其他替代方案,如DOM、SAX、...