我在使用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
相同的文件夹中,但这也无效。
答案 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());
虽然我不确定为什么,但似乎工作正常。