为什么需要专门告诉JAXBContext包中已经存在的类?

为什么需要专门告诉JAXBContext包中已经存在的类?,jaxb,Jaxb,该计划: import foo.bar.baz.ClassSpecificallyIncluded; import javax.xml.bind.JAXBContext; public class A { public static void main(String[] args) throws Exception { System.out.println(JAXBContext.newInstance(ClassSpecificallyIncluded.

该计划:

import foo.bar.baz.ClassSpecificallyIncluded;  
import javax.xml.bind.JAXBContext;  
public class A {  
    public static void main(String[] args) throws Exception {  
        System.out.println(JAXBContext.newInstance(ClassSpecificallyIncluded.class).toString());  
        System.out.println(JAXBContext.newInstance("foo.bar.baz").toString());  
    }  
}  
为第一个和第二个JAXBContext生成不同的输出:

jar:file:/C:/dev/trunk/rt/tomcat/shared/lib/webservices-rt-2.0.1.jar/com/sun/xml/bind/v2/runtime/JAXBContextImpl.class构建Id:1.0
在此上下文中已知的类:
[B
布尔值
字节
字符
foo.bar.baz.Class1
foo.bar.baz.Class1$NestedClass
食品酒吧商场类别2
foo.bar.baz.classspecifically包含
foo.bar.baz.另一个类
com.sun.xml.bind.api.CompositeStructure
双倍
浮动
int
java.awt.Image
java.io.File
java.lang.Boolean
java.lang.Byte
java.lang.Character
java.lang.Class
java.lang.Double
java.lang.Float
java.lang.Integer
java.lang.Long
java.lang.Object
java.lang.Short
java.lang.String
java.lang.Void
java.math.BigDecimal
java.math.biginger
java.net.URI
java.net.URL
java.util.Calendar
java.util.Date
java.util.Gregorianalendar
java.util.UUID
javax.activation.DataHandler
javax.xml.bind.JAXBElement
javax.xml.datatype.Duration
javax.xml.datatype.XMLGregorianCalendar
javax.xml.namespace.QName
javax.xml.transform.Source


空虚

jar:file:/C:/dev/trunk/rt/tomcat/shared/lib/webservices-rt-2.0.1.jar!/com/sun/xml/bind/v2/runtime/JAXBContextImpl.class构建Id:1.0
在此上下文中已知的类:
[B
布尔值
字节
字符
foo.bar.baz.Class1
foo.bar.baz.Class1$NestedClass
食品酒吧商场类别2

foo.bar.baz.另一个类
com.sun.xml.bind.api.CompositeStructure
双倍
浮动
int
java.awt.Image
java.io.File
java.lang.Boolean
java.lang.Byte
java.lang.Character
java.lang.Class
java.lang.Double
java.lang.Float
java.lang.Integer
java.lang.Long
java.lang.Object
java.lang.Short
java.lang.String
java.lang.Void
java.math.BigDecimal
java.math.biginger
java.net.URI
java.net.URL
java.util.Calendar
java.util.Date
java.util.Gregorianalendar
java.util.UUID
javax.activation.DataHandler
javax.xml.bind.JAXBElement
javax.xml.datatype.Duration
javax.xml.datatype.XMLGregorianCalendar
javax.xml.namespace.QName
javax.xml.transform.Source


空虚

然而,类具体包含在foo.bar.baz包中:

//  
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6   
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>   
// Any modifications to this file will be lost upon recompilation of the source schema.   
// Generated on: 2012.05.14 at 10:47:17 PM IST   
//  

package foo.bar.baz;  

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


@XmlAccessorType(XmlAccessType.FIELD)  
@XmlType(name = "", propOrder = {  
    "applicationArea",  
    "dataArea"  
})  
@XmlRootElement(name = "ClassSpecificallyIncluded")  
public class ClassSpecificallyIncluded {...  
//
//该文件由JDK 6中的JavaTM XML绑定体系结构(JAXB)参考实现vJAXB 2.1.10生成
//看
//重新编译源架构时,对此文件的任何修改都将丢失。
//生成日期:2012.05.14美国标准时间下午10:47:17
//  
包foo.bar.baz;
导入javax.xml.bind.annotation.XmlAccessType;
导入javax.xml.bind.annotation.XmlAccessorType;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=”“,proporter={
“应用领域”,
“数据区”
})  
@XmlRootElement(name=“ClassSpecificallyIncluded”)
公共类具体包括{。。。
两种jaxbcontext的类路径和类加载器是相同的

那么为什么第二个JAXBContext不知道ClassSpecificallyIncluded?

在包名上创建JAXBContext 假设我在名为
forum20273355
的目录中有以下类:

  • 地址
  • 客户(个人)
  • 哺乳动物
  • 人员(包括哺乳动物和地址类型的财产)
如果使用以下代码创建
JAXBContext

JAXBContext jc=JAXBContext.newInstance(“forum20273355”);
然后我将得到以下异常:

线程“main”javax.xml.bind.JAXBException中的异常:未能实例化提供程序com.sun.xml.bind.v2.ContextFactory:javax.xml.bind.JAXBException:“forum20273355”不包含ObjectFactory.class或jaxb.index -除此之外: [javax.xml.bind.JAXBException:“forum20273355”不包含ObjectFactory.class或jaxb.index] 位于javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:146) 位于javax.xml.bind.ContextFinder.find(ContextFinder.java:334) 位于javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:431) 位于javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:394) 位于javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:298) 在forum20273355.Demo.main(Demo.java:8) 原因:javax.xml.bind.JAXBException:“forum20273355”不包含ObjectFactory.class或jaxb.index 位于com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:197) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:601) 位于javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:172) 位于javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:132) …还有5个 指定
jaxb.index
ObjectFactory
下面我们将创建一个
jaxb.index
文件和
ObjectFactory
,这将导致处理
Person
类以查看发生了什么

jaxb.index

jaxb.index
是一个文本文件,其中包含短类名的回车分隔列表

Person
ObjectFactory

导入ja
forum20273355.Address
forum20273355.Mammal
forum20273355.Person
forum20273355.Address
forum20273355.Customer
forum20273355.Mammal
forum20273355.Person