在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(
-
- JAXB_CONTEXT_FACTORY,
-
-
- contextPath,
-
-
- 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
分享到:
相关推荐
编写xsd文件,利用jaxb生成java类。
jaxb学习资料
JAXB学习笔记 项目为了进行xml与java bean的互转,参考了各位网友的推荐,最后选型为JAXB,闲暇之余整理了一下笔记。废话不多说,上代码
JAXB的使用JAXB的使用JAXB的使用JAXB的使用
NULL 博文链接:https://lijie-insist.iteye.com/blog/2160015
无需安装,解压后即可。jaxb-api.jar,jaxb-xjc.jar,jaxb-impl.jar,activation.jar等相关jar包在lib文件夹下。
JAXB的安装包及插件
jaxb-api jaxb-impl jar
JAXB的 eclipse插件 JAXB的 eclipse插件 JAXB的 eclipse插件 JAXB的 eclipse插件 JAXB的 eclipse插件
在使用webservice,mule esb等需要jaxb的项目里经常会出现 JAXB 2.0 API is being loaded from the bootstrap classloader这个错误,按照打出的信息Use the endorsed directory mechanism to place jaxb-api.jar in ...
使用java jdk的JAXB技术实现xml与java对象互相转化...•JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。 •Marshaller接口,将Java对象序列化为XML数据。 •Unmarshaller接口,将XML数据反序列化为Java对象。
四、JAXB 的简单应用 JAXB 的简单应用可以分为两步: 第一步:创建要转化的 Java 对象,该对象需要使用相关注解注释各字段(标注在 get 方法上)。 第二步:编组(Java 对象转 xml),提供多种编组目的地,例如...
JAXB2.0的使用方法和测试代码,作者根据使用测试得出的总结。
JAXB的HelloWorld源码,适合想学习JAXB技术的新手学习。
jaxb-api jaxb-impl jaxb-xjc jaxws-rt 这四个文件对应的jar包
activation.jar jaxb1-impl.jar jaxb-api.jar jaxb-impl.jar jaxb-xjc.jar jsr173_1.0_api.jar系列jar下载
Jaxb annotation 使用 Jaxb annotation初步使用
java -jar JAXB2_20060607.jar On Windows, you can just double-click the jar file to execute. Release Notes Browse the release notes online, including what's new. Technical Support Please subscribe to...
有关Maven项目中缺少jaxb-api的异常报错解决,jaxb-api-2.3.0.jar
JAXB注解相关技术JAXB注解相关技术JAXB注解相关技术JAXB注解相关技术JAXB注解相关技术JAXB注解相关技术