2

根据下面的回复,用我的最新示例更新这篇文章。


我正在尝试使用 MOXY 创建一个 DynamicJAXBContext 使用一个简单的模式,该模式使用 GML 2.1.2 模式(导入 xlink)。似乎 moxy 在导入 GML 模式(或 GML 导入的 xlink 模式)时遇到问题。我尝试向 DynamicJAXBContextFactory 提供 jaxb 绑定文件,但这不起作用。

我正在使用 eclipselink 2.4.2(每晚 2/20)和 jaxb-xjc 2.1.12。正在生成的异常如下:

异常 [EclipseLink-0](Eclipse 持久性服务 - 2.4.2.v20130220-bf58d47):org.eclipse.persistence.exceptions.IntegrityException 描述符

例外:

异常 [EclipseLink-217] (Eclipse Persistence Services - 2.4.2.v20130220-bf58d47):org.eclipse.persistence.exceptions.DescriptorException 异常描述:XMLDirectMapping/XMLCompositeDirectCollectionMapping 的 XPath 无效。XPath 必须包含属性的@ 符号或以/text() 结尾的文本节点。例如:“@name”或“name/text()” 映射:org.eclipse.persistence.oxm.mappings.XMLDirectMapping[title-->ns2:title] 描述符:XMLDescriptor(org.w3._1999.xlink.Extended --> [])

异常 [EclipseLink-217] (Eclipse Persistence Services - 2.4.2.v20130220-bf58d47):org.eclipse.persistence.exceptions.DescriptorException 异常描述:XMLDirectMapping/XMLCompositeDirectCollectionMapping 的 XPath 无效。XPath 必须包含属性的@ 符号或以/text() 结尾的文本节点。例如:“@name”或“name/text()” 映射:org.eclipse.persistence.oxm.mappings.XMLDirectMapping[xlinkTitle1-->ns2:title] 描述符:XMLDescriptor(org.w3._1999.xlink.LocatorType --> [DatabaseTable(ns2:locator)])

异常 [EclipseLink-217] (Eclipse Persistence Services - 2.4.2.v20130220-bf58d47):org.eclipse.persistence.exceptions.DescriptorException 异常描述:XMLDirectMapping/XMLCompositeDirectCollectionMapping 的 XPath 无效。XPath 必须包含属性的@ 符号或以/text() 结尾的文本节点。例如:“@name”或“name/text()” 映射:org.eclipse.persistence.oxm.mappings.XMLDirectMapping[xlinkTitle2-->ns2:title] 描述符:XMLDescriptor(org.w3._1999.xlink.ArcType --> [数据库表(ns2:arc)])

运行时异常:

在 org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:638) 在 org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:574) 在 org.eclipse.persistence.internal .sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:533) 在 org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:777) 在 org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.login(DatabaseSessionImpl .java:735) 在 org.eclipse.persistence.oxm.XMLContext$XMLContextState.(XMLContext.java:940) 在 org.eclipse.persistence.oxm.XMLContext$XMLContextState.(XMLContext.java:915) 在 org.eclipse。 org.eclipse 上的 persistence.oxm.XMLContext.(XMLContext.java:194)。persistence.jaxb.dynamic.DynamicJAXBContext$SchemaContextInput.createContextState(DynamicJAXBContext.java:332) 在 org.eclipse.persistence.jaxb.JAXBContext.(JAXBContext.java:169) 在 org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext.( DynamicJAXBContext.java:70) 在 org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory.createContextFromXSD(DynamicJAXBContextFactory.java:309) 在 ogc.catalog.moxy.TestMoxy.testMoxy(TestMoxy.java:45)java:309) 在 ogc.catalog.moxy.TestMoxy.testMoxy(TestMoxy.java:45)java:309) 在 ogc.catalog.moxy.TestMoxy.testMoxy(TestMoxy.java:45)

这是我的测试moxy类:

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBException;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;

import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory;
import org.junit.Test;

public class TestMoxy {

    private static final String SCHEMA = "example-feature.xsd";

    @Test
    public void testMoxy() throws JAXBException {

        System.setProperty("javax.xml.bind.context.factory",
                "org.eclipse.persistence.jaxb.DynamicJAXBContextFactory");

        System.setProperty("com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.noCorrectnessCheck",
                "true");

        InputStream schema = this.getClass().getClassLoader().getResourceAsStream(SCHEMA);

        Source schemaSource = new StreamSource(schema);
        schemaSource.setSystemId(SCHEMA);

        InputStream xjbStream = this.getClass().getClassLoader()
                .getResourceAsStream("xlink-bindings.xjb");
        Source xjbSource = new StreamSource(xjbStream);
        xjbSource.setSystemId(SCHEMA);

        Map<String, Object> props = new HashMap<String, Object>();
        props.put(DynamicJAXBContextFactory.EXTERNAL_BINDINGS_KEY, xjbSource);

        try {
            DynamicJAXBContext jaxbContext = DynamicJAXBContextFactory.createContextFromXSD(
                    schemaSource, null, null, props);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这是example-feature.xsd:

<?xml version='1.0' encoding='UTF-8'?>
<xsd:schema elementFormDefault='qualified' targetNamespace='http://example.org' 
    xmlns:example='http://example.org' 
    xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
    xmlns:gml='http://www.opengis.net/gml'>
    <xsd:import namespace='http://www.opengis.net/gml' schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd"/>
    <xsd:complexType name='example_featureType'>
        <xsd:complexContent>
            <xsd:extension base='gml:AbstractFeatureType'>
                <xsd:sequence>
                    <xsd:element maxOccurs='1' minOccurs='1' name='id' nillable='false' type='xsd:long'/>
                    <xsd:element maxOccurs='1' minOccurs='1' name='version' nillable='false' type='xsd:long'/>
                    <xsd:element maxOccurs='1' minOccurs='0' name='access_date' nillable='true' type='xsd:dateTime'/>
                    <xsd:element maxOccurs='1' minOccurs='0' name='ground_geom' nillable='true' type='gml:PolygonPropertyType'/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:element name='exampleFeature' substitutionGroup='gml:_Feature' type='example:example_featureType'/>
</xsd:schema>

和 xlink-bindings.xjb:

<jaxb:bindings version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionBindingPrefixes="xjc">
    <jaxb:bindings schemaLocation="http://www.w3.org/1999/xlink.xsd">
        <jaxb:bindings node="//xs:attributeGroup[@name='locatorAttrs']//xs:attribute[@ref='xlink:title']">
            <jaxb:property name="xlink:title1" />
        </jaxb:bindings>
        <jaxb:bindings node="//xs:attributeGroup[@name='arcAttrs']//xs:attribute[@ref='xlink:title']">
            <jaxb:property name="xlink:title2" />
        </jaxb:bindings>
    </jaxb:bindings>

    <jaxb:bindings schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd"
        node="/xs:schema">
        <jaxb:globalBindings fixedAttributeAsConstantProperty="false"
            typesafeEnumBase="xs:string" typesafeEnumMemberName="generateName" generateIsSetMethod="true"
            generateMixedExtensions="true">
            <xjc:noValidator />
            <xjc:noValidatingUnmarshaller />
        </jaxb:globalBindings>

        <jaxb:schemaBindings>
            <jaxb:package name="ogc.schema.opengis.gml.v_2_1_2" />
            <jaxb:nameXmlTransform>
                <jaxb:elementName suffix="Element" />
            </jaxb:nameXmlTransform>
        </jaxb:schemaBindings>
        <jaxb:bindings node="xs:element[@name='_geometryProperty']">
            <jaxb:class name="AbstractGeometryProperty" />
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

注意xjc 对我有用: xjc -extension example-feature.xsd -b xlink-bindings.xjb

xjc 版本“JDK 6 中的 JAXB 2.1.10” *java 版本“1.6.0_38”*

4

2 回答 2

3

我能够使用这个绑定文件让 xjc v2.1.10 编译器工作:

<jaxb:bindings version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
jaxb:extensionBindingPrefixes="xjc">

<jaxb:bindings schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd"
    node="/xs:schema">
    <jaxb:schemaBindings>
        <jaxb:package name="ogc.schema.opengis.gml.v_2_1_2" />
        <jaxb:nameXmlTransform>
            <jaxb:elementName suffix="Element" />
        </jaxb:nameXmlTransform>
    </jaxb:schemaBindings>
    <jaxb:bindings node="xs:element[@name='_geometryProperty']">
        <jaxb:class name="AbstractGeometryProperty" />
    </jaxb:bindings>
</jaxb:bindings>

<jaxb:bindings schemaLocation="http://www.w3.org/1999/xlink.xsd">
    <jaxb:bindings
        node="//xs:attributeGroup[@name='locatorAttrs']//xs:attribute[@ref='xlink:title']">
        <jaxb:property name="xlink:title1" />
    </jaxb:bindings>
    <jaxb:bindings
        node="//xs:attributeGroup[@name='arcAttrs']//xs:attribute[@ref='xlink:title']">
        <jaxb:property name="xlink:title2" />
    </jaxb:bindings>
</jaxb:bindings>

但是当我尝试运行 java 测试时,我得到:

java.lang.NullPointerException
at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.processXmlSeeAlso(AnnotationsProcessor.java:1201)
at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.preBuildTypeInfo(AnnotationsProcessor.java:555)
at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.processClassesAndProperties(AnnotationsProcessor.java:267)
at org.eclipse.persistence.jaxb.compiler.Generator.<init>(Generator.java:104)
at org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext$SchemaContextInput.createContextState(DynamicJAXBContext.java:316)
at org.eclipse.persistence.jaxb.JAXBContext.<init>(JAXBContext.java:157)
at org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext.<init>(DynamicJAXBContext.java:70)
at org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory.createContextFromXSD(DynamicJAXBContextFactory.java:302)
at ogc.common.schema.test.TestMoxy.testEntityResolver(TestMoxy.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

不确定这是否有帮助。

-基思

于 2013-02-14T21:36:16.080 回答
1

我一直在查看您的问题,但也无法使其正常工作。我尝试使用 XJC 模式编译器,但它也存在模式冲突问题,并且 EclipseLink 依赖于 XJC 来创建动态 JAXB 上下文。

首先,当我在 Eclipse 中运行你的测试用例时,我得到了一个稍微不同的错误:

com.sun.istack.SAXParseException2: Property "Title" is already defined. Use &lt;jaxb:property> to resolve this conflict.

但是我看到在您的绑定文件中,您已经在使用 jaxb:property 作为标题(小写),并且我在任何相关的 XSD 中都找不到任何标题(大写)。

其次,当我运行 XJC 时,我得到:

C:\...\src\omar>xjc example-feature.xsd -b xlink-bindings.xjb
parsing a schema...
compiling a schema...
[ERROR] Two declarations cause a collision in the ObjectFactory class.
  line 28 of http://schemas.opengis.net/gml/2.1.2/feature.xsd

[ERROR] (Related to above error) This is the other declaration.
  line 29 of http://schemas.opengis.net/gml/2.1.2/feature.xsd

Failed to produce code.

但这也很奇怪,因为 feature.xsd 的第 29 行是:

<element name="geometryProperty" type="gml:GeometryAssociationType"/>

但我找不到与geometryProperty 的任何冲突。

希望这些信息足以让您获得一个绑定文件,以便让 XJC 正常工作。此时,您应该能够引导 DynamicJAXBContext。xjc 可执行文件位于您的 JAVA_HOME\bin 目录中。

  • 瑞克
于 2013-02-14T20:45:44.860 回答