Информация о пакете Jaxb игнорируется при использовании Java 10 - PullRequest
0 голосов
/ 04 сентября 2018

Я борюсь с этим, и любая информация будет принята с благодарностью. У меня есть проект, который уже некоторое время использует JAXB для построения Java-модели из XML-схемы и использует эту модель. Это работало в Java 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-для генерации источников, и они выглядят хорошо. Я обновил до последней версии этого плагина (на момент написания этой статьи, 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-осущ: 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.

Спасибо за любую помощь, Ed

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Я нашел следующее решение для той же проблемы в моем проекте с 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);
0 голосов
/ 24 сентября 2018

На самом деле я сейчас сталкиваюсь с той же проблемой на Java 9.

Добавление системного свойства com.sun.xml.bind.backupWithParentNamespace заставляет его работать, но я чувствую, что это решает проблему.

Я посмотрел на источник Java 9 (еще не смотрел на источник Java 10), и он находится внутри метода java.lang.Package.getPackageInfo (), который пытается загрузить класс информации о пакете, используя:

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

Если заменить его на

...
c = loader.loadClass(cn);
...

все нормально загружается и все хорошо.

Для меня это выглядит как ошибка JDK.

В последнем подключаемом модуле maven-jaxb2 есть следующая опция для отключения аннотаций на уровне пакета:

<packageLevelAnnotations>false</packageLevelAnnotations>

Это решило мою проблему.

Другие плагины XJC, похоже, используют аргумент "-npa" для отключения аннотаций на уровне пакета

...