当前位置: 首页 > 知识库问答 >
问题:

jaxb抛出javax.xml.bind.UnMarshalException:只有在osgi捆绑包中运行时,才需要元素(无

江飞白
2023-03-14

我想在liberty osgi web应用程序中使用jaxb解组xml。

InputStream is = new FileInputStream(serviceXmlPath);
JAXBContext jaxbContext = JAXBContext.newInstance(Service.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
return jaxbUnmarshaller.unmarshal(is);
[err] javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"Service"). Expected elements are (none)
[err]   at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:660)
ClassLoader classloader = MyClass.class.getClassLoader();
jaxbContext = JAXBContext.newInstance(MyClass.class.getName(), classloader);
[err] javax.xml.bind.JAXBException: Unable to create context
 - with linked exception:
[java.lang.reflect.InvocationTargetException]
JAXBContext jaxbContext = JAXBContext.newInstance(Service.class);
JAXBContext jaxbContext2 = JAXBContext.newInstance();
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();   

System.out.println("classloader of Service.class:" + Service.class.getClassLoader().toString());
System.out.println("classloader of JAXBContext:" + JAXBContext.class.getClassLoader());
System.out.println("classloader of jaxbContext:" + jaxbContext.getClass().getClassLoader());
System.out.println("classloader of jaxbContext2:" + jaxbContext2.getClass().getClassLoader());
System.out.println("classloader of jaxbUnmarshaller:" + Unmarshaller.class.getClassLoader());

当我运行它时,我得到了:

classloader of Service.class:org.eclipse.osgi.internal.loader.EquinoxClassLoader@b0adb798[DataService:1.0.0.qualifier(id=379)]
classloader of JAXBContext:org.eclipse.osgi.internal.loader.EquinoxClassLoader@271677de[com.ibm.ws.javaee.jaxb.2.2:1.0.11.cl50820151201-1942(id=343)]
classloader of jaxbContext:org.eclipse.osgi.internal.loader.EquinoxClassLoader@b997af78[com.ibm.ws.xlxp.1.5.3:1.0.11.cl50820151201-1942(id=341)]
classloader of jaxbContext2:org.eclipse.osgi.internal.loader.EquinoxClassLoader@b997af78[com.ibm.ws.xlxp.1.5.3:1.0.11.cl50820151201-1942(id=341)]
classloader of jaxbUnmarshaller:org.eclipse.osgi.internal.loader.EquinoxClassLoader@271677de[com.ibm.ws.javaee.jaxb.2.2:1.0.11.cl50820151201-1942(id=343)

请注意,是否传入类并不重要,它正在使用自己的类加载器(顺便说一句,这是在Liberty中启用了JAXB2.2。如果我禁用它,除了第一个类加载器之外,其他类加载器都显示为空,但行为相同)

共有1个答案

姜俊逸
2023-03-14

我终于让它起作用了。在我的bundle清单中,我导入了javax.xml.bind包,我认为它是我所需要的全部,因为它是我在调用解组的代码中导入的。结果表明,我还需要添加javax.xml.bind.Annotation,因为模型类导入了javax.xml.bind.Annotation。

不管怎样,谢谢斯科特的评论

 类似资料:
  • 我有以下示例方案...(请注意,我可以使用服务实现该场景,但我正在尝试一些事情) 一个带有激活器类(将其命名为“客户端”)的OSGi捆绑包,另一个OSGi打包包是一个简单的库(将其称为“服务器”),公开了一个名为callMe()的方法。在“client”的start()方法中,有一个对“server”的callMe()方法的调用。当然,“服务器”包公开了我们使用callMe()方法的类的包,“客户

  • 我有几个OSGi捆绑包,它们是在Eclipse中使用普通清单管理依赖项和Maven Tycho的外部构建构建构建的。 在Equinox上运行Eclipse内部的捆绑包工作正常。用第谷建造它们效果很好。 现在我想使用Tycho Surefire运行集成测试,为此我创建了一个简单的测试包,其中包含一些基本测试。测试中的bundle依赖于OSGi容器中的其他bundle和一些小的启动级别调整,以便正确运

  • 我正在开发超文本传输协议客户端应用程序作为一个OSGI捆绑项目,我已经使用apache maven创建项目文件夹结构使用下面的命令。 上面的命令创建了项目文件夹结构,因为我使用的是基于httpclient的应用程序。我在pom中添加了依赖项。xml如下所示。 我执行以下命令, 根项目上进行构建 它在本地maven存储库中创建了所需的jar文件。 问题从这里开始。我试图在ApacheServiceM

  • 我是OSGi的新手。我正在使用Apache Felix。我已经构建了一个捆绑包,并且具有依赖性。当我尝试使用启动它会给我这个错误。 org . OSGi . framework . bundle exception:无法解析lk . ucsc . research . belly runner[20](R 20.0):缺失需求[lk . ucsc . research . belly runner

  • 我试图在Felix中添加一个新的OSGI包(没有Karaf)作为ActiveMQ客户端(消息发送方)。 ActiveMQ客户端在非OSGI环境中运行良好。但当我在Felix中使用相同的代码(稍加修改)时,它会抛出以下错误: org.osgi.framework.捆绑异常:无法解决com.packtpub.felix.bookshelf-库存-impl-mock[7](R 7.3):缺少需求[com

  • 问题内容: 我的要求是使用hibernate映射各种数据库(尤其是SQL Server,MySQl和Postgres);从db记录创建一个xml文件。 对于hibernate,我正在使用JAssist在运行时创建hbm文件和pojos。我的代码很棒,为了进一步模块化,我为每个数据库实现了片段捆绑包,以便我的主机捆绑包可以处理运行时类的创建并将其添加到类加载器,hbm文件创建逻辑和BL中。片段通过传