【问题标题】:Jaxb package-info ignored when using Java 10使用 Java 10 时忽略 Jaxb 包信息
【发布时间】:2019-02-08 22:35:12
【问题描述】:

我正在为此苦苦挣扎,任何信息将不胜感激。我有一个项目一直在使用 JAXB 从 XML 模式构造 Java 模型并使用该模型。这已经在 J​​ava 8 中工作了一段时间。

但是,我已升级到 Open JDK 10,当我尝试将 XML 文件解组到 Java 对象中时出现此错误....

java.lang.IllegalArgumentException: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.minestar.cat.com/namespace/units",
 local:"units"). Expected elements are <{}units>
        at minestar.units.schema.parser.UnitsXmlParser.readXml(UnitsXmlParser.java:31)
        at minestar.units.javagenerator.JavaGeneratorPlugin.execute(JavaGeneratorPlugin.java:41)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:956)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:290)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:194)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.minestar.cat.com/namespace/units", local:"units"). Expected
 elements are <{}units>
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:741)
        at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:262)
        at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:257)
        at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:124)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1149)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:574)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:556)
        at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:168)
        at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScanner
Impl.java:613)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScan
nerImpl.java:3058)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:821)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:5
32)
        at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:888)
        at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824)
        at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
        at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
        at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:635)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:258)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:229)
        at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:170)
        at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:209)
        at minestar.units.schema.parser.UnitsXmlParser.readXml(UnitsXmlParser.java:29)
        ... 23 more

我正在使用 maven-jaxb2-plugin 生成源代码,它们看起来不错。我已经升级到这个插件的最新版本(在撰写本文时,0.14.0)。这些类生成良好,并且生成了一个 package-info.java 类并将其编译到生成的 jar 中。有问题的类在顶部看起来像这样

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "dimensions",
    "quantityTypes"
})
@XmlRootElement(name = "units")
public class Units {

    @XmlElement(name = "dimension")
    protected List<Dimension> dimensions;
    @XmlElement(name = "quantityType")
    protected List<QuantityType> quantityTypes;

package-info.java 看起来像这样

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.minestar.cat.com/namespace/units", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package minestar.units.schema;

因为这是 Java 10,所以我在 javax.xml.bind:jaxb-api:2.3.0、com.sun.xml.bind:jaxb-core:2.3.0 和 com.sun 中添加了直接依赖项。 xml.bind:jaxb-impl:2.3.0.

我尝试将 JAXB 实现从 RI 更改为 Eclipse MOXy,但这没有任何区别。

作为测试,我编辑了上面生成的Units.java类文件,将命名空间属性添加到@XmlRootElement注解...

@XmlRootElement(namespace = "http://www.minestar.cat.com/namespace/units", name = "units")
public class Units {

当这个java文件被编译并被下游使用时,XML文件就可以被解析了。我没有收到 UnmarshalException。但是,这个源文件是生成的,所以我不能依赖这些更改保持不变。此外,根据我从比我自己更知情的人那里读到的所有内容,package-info.class 文件(在 JAR 文件中)应该使注释中的命名空间值变得不必要。

如果有什么我没有正确设置,我会感谢任何帮助以使其在 Java 10 中工作。

感谢您的帮助, 埃德

【问题讨论】:

  • @nullpointer 不完全。我不认为,反正。我确实找到了他们。在第一个问题中,我在相关类中有 XmlRootElement 注释(根据接受的答案)。我的模块中还有一个 package-info.class (根据第二个答案)。在第二个问题中,虽然我在 XmlRootAttribute 注释中没有命名空间属性,但我不应该基于 package-info 中定义的 XmlSchema 注释的存在(根据第二个问题的第二个答案)。我同意他们是同一个例外。但我认为我正在做这些答案所暗示的事情
  • 我对 Java 11 和 jaxb 2.3.2 有同样的问题 - 有什么解决方案吗?

标签: jaxb java-10


【解决方案1】:

我在命名空间方面也有类似的问题,在自制插件中使用 JAXB 解组。

我正在使用 Java 11。

我解决了将 maven 升级到 3.6.2 的问题(问题出现在 maven 3.5.2 上)。不确定能够解释它为什么起作用,但如果它对某人有帮助......

【讨论】:

    【解决方案2】:

    实际上我目前在 Java 9 上面临同样的问题。

    添加 com.sun.xml.bind.backupWithParentNamespace 系统属性使其工作,但我觉得这是解决问题。

    我查看了 Java 9 源代码(尚未查看 Java 10 源代码),它位于 java.lang.Package.getPackageInfo() 方法中,它尝试使用以下方法加载 package-info 类:

    ...
    String cn = packageName() + ".package-info";
    Module module = module();
    ...
    c = loader.loadClass(module, cn);
    ...
    

    如果我用

    代替它
    ...
    c = loader.loadClass(cn);
    ...
    

    它可以很好地加载它,一切都很好。

    对我来说,它看起来像一个 JDK 错误。

    最新的 maven-jaxb2-plugin 确实有以下选项来关闭包级注释:

    <packageLevelAnnotations>false</packageLevelAnnotations>
    

    这解决了我的问题。

    其他 XJC 插件似乎使用“-npa”参数来关闭包级注释

    【讨论】:

    • 在我的插件配置中使用 packageLevelAnnotations(在确保我包含正确的依赖项之后)在 Java 10 中也为我解决了这个问题。谢谢!
    • 感谢您找到此解决方法...如果您在使用 java 9、10 或 11 解组意外元素 (uri:"...." 时遇到错误,您可能遇到了这个错误. 尝试从 java 8 迁移代码时,我花了很长时间才想到这个。
    【解决方案3】:

    我在使用 JDK 9 的项目中找到了针对相同问题的以下解决方案:

        JAXBContext ctx = JAXBContext.newInstance(YOUR_CLASS.class);
        Unmarshaller unmarshaller = ctx.createUnmarshaller();
        SAXParserFactory sax = SAXParserFactory.newInstance();
        sax.setNamespaceAware(false); // This line is important!
        XMLReader reader = sax.newSAXParser().getXMLReader();
        Source source = new SAXSource(reader, new InputSource(new StringReader(xml)));
        return (YOUR_CLASS) unmarshaller.unmarshal(source);
    

    【讨论】:

    • setNamespaceAware(false);默认为假。
    【解决方案4】:

    这是一个 Maven 错误,Mojos are unable to load package annotations on Java >= 9,已在 3.6.2 中修复

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 2012-10-12
      • 2011-06-29
      • 1970-01-01
      • 2018-07-23
      • 2021-05-11
      • 1970-01-01
      相关资源
      最近更新 更多