JAXB Marshal异常:.Impl类或任何超类都不为任何此上下文所知

时间:2012-04-27 12:24:14

标签: java jaxb

我在使用JAXB编组Java对象时遇到问题。 当我作为一个独立的应用程序运行Web服务时,它工作正常。

当我将它与我的项目集成,并使用生成的Java类时, 在编组时,我得到了一个例外

  

RequestImpl类或其任何超类都不为任何这种情况所知。

在生成我的JAXB实例时,我使用以下语句:

JAXBContext jaxb = JAXBContext.newInstance("com.eos.hotels.API.Request");

我有两个单独的xsds,一个用于Request,另一个用于Response

生成的java类存储在文件夹结构中,如下所示:

API->Request
API->Response

在上述两个文件夹中,都会创建ObjectFactory.java并且jaxb.properties也在那里。

此外,在上述每个文件夹中,创建了impl文件夹,其中包含所有Impl个文件,并且在此impl文件夹中创建了runtime文件夹。

XSD中的所有xs:element都是作为接口创建的,只有Impls是类。 此外,生成的java文件中没有XML注释。

谁能告诉我这里出了什么问题?

是否由于文件夹结构或因为XML注释不存在而发生此问题?

我在网上看到注释如果不存在也不是问题。

我甚至尝试将生成的impl类复制到与ObjectFactory.java相同的文件夹中,但这也无效。

4 个答案:

答案 0 :(得分:1)

尝试在JAXBContext对象上调用toString方法。因为您使用的是JAXB1类,所以它应该显示如下内容:com.eos.hotels.API.impl.runtime.DefaultJAXBContextImpl。如果不是 - 您可能没有com.eos.hotels.API包中的jaxb.properties文件,或者您已删除com.eos.hotels.API.impl.runtime包。

答案 1 :(得分:0)

在从多个目录生成的类上创建JAXBContext时,您需要包含由冒号':'分隔的所有包名。

 JAXBContext jaxb = JAXBContext.newInstance("com.example.package1:org.example.package2");

答案 2 :(得分:0)

所以你正在使用jaxb1,并从2个不同的XSD生成你的jaxb类,希望声明两个独立的命名空间URI(否则会弄乱JAXB)。

首先,我会考虑合并两个XSD,并拥有一个名称空间URI。您仍然可以使用相同的包结构,或者最终使用单个包结构,但更重要的是最终将使用单个运行时文件夹。 此外,您将最终得到一个ObjectFactory,并且当使用同一个类中的两个ObjectFactory类时,这将阻止必须使用FQCN(完全限定的类名)(这将使您的import语句无效,这可能是一个陷阱在这里也发挥。)

当你构建JAXBContext时,请确保列出所有 root 包(而不是impl包),你应该好好去。

试试这个,让我们知道你得到了什么。祝你好运。

答案 3 :(得分:0)

在创建JAxbContext时,我使用了以下内容:

JAXBContext jaxb = new DefaultJAXBContextImpl(packagename, ObjectFactory.class                 .getClassLoader());

虽然我不确定为什么,但似乎工作正常。