编组时出现 JAXB 错误

Posted

技术标签:

【中文标题】编组时出现 JAXB 错误【英文标题】:JAXB error while marshalling 【发布时间】:2013-06-17 11:56:03 【问题描述】:

当我尝试将 JAXB 对象编组为 XML 时出现此错误。 JAXBContext 无法找到我正在传递的类。我被困在这里。 非常感谢这方面的任何帮助。

Exception in thread "main" java.lang.InternalError
    at com.sun.xml.internal.bind.v2.model.annotation.RuntimeInlineAnnotationReader.getClassValue(RuntimeInlineAnnotationReader.java:128)
    at com.sun.xml.internal.bind.v2.model.annotation.RuntimeInlineAnnotationReader.getClassValue(RuntimeInlineAnnotationReader.java:42)
    at com.sun.xml.internal.bind.v2.model.impl.PropertyInfoImpl.isApplicable(PropertyInfoImpl.java:201)
    at com.sun.xml.internal.bind.v2.model.impl.PropertyInfoImpl.getApplicableAdapter(PropertyInfoImpl.java:212)
    at com.sun.xml.internal.bind.v2.model.impl.PropertyInfoImpl.<init>(PropertyInfoImpl.java:111)
    at com.sun.xml.internal.bind.v2.model.impl.SingleTypePropertyInfoImpl.<init>(SingleTypePropertyInfoImpl.java:60)
    at com.sun.xml.internal.bind.v2.model.impl.AttributePropertyInfoImpl.<init>(AttributePropertyInfoImpl.java:48)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeAttributePropertyInfoImpl.<init>(RuntimeAttributePropertyInfoImpl.java:43)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeClassInfoImpl.createAttributeProperty(RuntimeClassInfoImpl.java:144)
    at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.addProperty(ClassInfoImpl.java:851)
    at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.findFieldProperties(ClassInfoImpl.java:387)
    at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.getProperties(ClassInfoImpl.java:290)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeClassInfoImpl.getProperties(RuntimeClassInfoImpl.java:165)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:212)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:89)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:178)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:84)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:293)
    at com.sun.xml.internal.bind.v2.model.impl.TypeRefImpl.calcRef(TypeRefImpl.java:81)
    at com.sun.xml.internal.bind.v2.model.impl.TypeRefImpl.getTarget(TypeRefImpl.java:58)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeTypeRefImpl.getTarget(RuntimeTypeRefImpl.java:47)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeTypeRefImpl.getTarget(RuntimeTypeRefImpl.java:40)
    at com.sun.xml.internal.bind.v2.model.impl.ElementPropertyInfoImpl$1.get(ElementPropertyInfoImpl.java:63)
    at com.sun.xml.internal.bind.v2.model.impl.ElementPropertyInfoImpl$1.get(ElementPropertyInfoImpl.java:61)
    at java.util.AbstractList$Itr.next(AbstractList.java:345)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:224)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:89)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:178)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:84)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:293)
    at com.sun.xml.internal.bind.v2.model.impl.TypeRefImpl.calcRef(TypeRefImpl.java:81)
    at com.sun.xml.internal.bind.v2.model.impl.TypeRefImpl.getTarget(TypeRefImpl.java:58)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeTypeRefImpl.getTarget(RuntimeTypeRefImpl.java:47)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeTypeRefImpl.getTarget(RuntimeTypeRefImpl.java:40)
    at com.sun.xml.internal.bind.v2.model.impl.ElementPropertyInfoImpl$1.get(ElementPropertyInfoImpl.java:63)
    at com.sun.xml.internal.bind.v2.model.impl.ElementPropertyInfoImpl$1.get(ElementPropertyInfoImpl.java:61)
    at java.util.AbstractList$Itr.next(AbstractList.java:345)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:224)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:89)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:178)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:84)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:293)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:308)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:430)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:277)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1100)
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:143)
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:110)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:376)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
    at src.example.MarshalCommlAuto.main(MarshalCommlAuto.java:48)

【问题讨论】:

您在什么类型的环境中运行(应用服务器、Java SE、OSGi 等)?你是如何创建你的JAXBContext的? 使用 JAVA SE、GlassFish。这就是我创建 JAXB 上下文的方式。我还将索引文件放在同一目录中。我对自己做错了什么一无所知。 JAXBContext jaxbContext = JAXBContext.newInstance(CommlAutoPolicyInfoType.class);编组器 jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); jaxbMarshaller.marshal(commlauto,文件); jaxbMarshaller.marshal(commlauto, System.out); 【参考方案1】:

当您从 Java 类创建 JAXBContext 时,JAXB impl 还将为所有可以访问的类创建元数据(包括属性类型、超类和注释中指定的类)。它不会打包扫描或拉入子类,因此需要注意确保为模型中的所有类生成元数据。

如果您的模型是从 XML 模式生成的,那么您应该根据生成的包名称创建 JAXBContext。为确保正确加载类,您还应该指定正确的ClassLoader。假设您的包名称是 com.example.foo,您可以执行以下操作。

JAXBContext jc = JAXBContext.newInstance("com.example.foo", CommlAutoPolicyInfoType.class.getClassLoader());

如果您的生成模型跨越多个包,则使用 : 字符分隔上下文路径中的包。

JAXBContext jc = JAXBContext.newInstance("com.example.foo:com.example.bar", CommlAutoPolicyInfoType.class.getClassLoader());

更多信息

JAXBContext.newInstance variations

【讨论】:

我试过了。它虽然有用。我不断收到同样的错误。我尝试过的一件事是,给出另一个类名而不是我需要的类名,并且它起作用了。所有的 JAXB 对象都是从 XML 模式创建的,所以我的假设是如果一个类可以被拾取,为什么不能从同一个包中获取任何其他类。你对此有什么想法吗? @user2487308 - 指定包名称应该适用于您的用例(您需要在应用服务器或 OSGi 环境中指定 ClassLoader。我已经更新了我的答案以提供一些额外的信息。 非常感谢您的回复!【参考方案2】:

我遇到了类似的问题,这是公司内部大型项目之一的一些传递依赖的问题(但我没有得到 ClassNotFound 异常,而是指向无处的 InternalError)。即使我使用了@Blaise 建议的提示,它也没有开始工作。

那么 - 我如何解决这个问题?首先 - 我已将 -verbose:class 添加到命令行以跟踪加载的类。有了这个,我发现我的 jaxb 包中的一些类(可能是那个示例包:"com.example.foo")由于某种原因没有加载。因此,我为 jaxb 包中的那些未加载类添加了示例导入,并在代码上进行了简单的使用,例如:

ExampleNotLoadedClass.class.getName();

最终在加载此类时使用上面的代码,我收到了来自不同包的类的ClassNotFound 异常。它应该包含在此工件的一些传递依赖项中,但由于某种原因,这不起作用(我认为没关系,我只会说我们正在划分我们的大项目并将一些工件提取到不同的子项目中) .

因此,我已将缺少的类依赖项直接添加到有问题的工件中,并且一切都开始正常工作。

希望对遇到类似问题的人有所帮助。

【讨论】:

以上是关于编组时出现 JAXB 错误的主要内容,如果未能解决你的问题,请参考以下文章

解组 JAXB 编组列表失败并出现 NullPointerException

JAXB Java 编组错误

使用 eclipselink 在 JPA 对象上进行 jaxb 编组期间的日期对话错误

自定义 jaxb 编组输出

JAXB 编组超类

JAXB 继承,解组到编组类的子类