无法创建DynamicJAXBContext - 从GML模式引导问题

时间:2013-02-14 17:17:57

标签: jaxb eclipselink moxy


根据以下回复使用我的最新示例更新此信息。


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

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

  

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

     

例外:

     

异常[EclipseLink-217](Eclipse持久性服务 -   2.4.2.v20130220-bf58d47):org.eclipse.persistence.exceptions.DescriptorException异常   说明:无效的XPath   XMLDirectMapping / XMLCompositeDirectCollectionMapping。 XPath必须   或者包含属性的@符号,或者以/ text()结尾包含文本   节点。例如:" @ name"或"名称/文字()"制图:   org.eclipse.persistence.oxm.mappings.XMLDirectMapping [标题 - > NS2:标题]   描述符:XMLDescriptor(org.w3._1999.xlink.Extended - > [])

     

异常[EclipseLink-217](Eclipse持久性服务 -   2.4.2.v20130220-bf58d47):org.eclipse.persistence.exceptions.DescriptorException异常   说明:无效的XPath   XMLDirectMapping / XMLCompositeDirectCollectionMapping。 XPath必须   或者包含属性的@符号,或者以/ text()结尾包含文本   节点。例如:" @ name"或"名称/文字()"制图:   org.eclipse.persistence.oxm.mappings.XMLDirectMapping [xlinkTitle1 - > NS2:标题]   描述符:XMLDescriptor(org.w3._1999.xlink.LocatorType - >   [DatabaseTable(NS2:定位器)])

     

异常[EclipseLink-217](Eclipse持久性服务 -   2.4.2.v20130220-bf58d47):org.eclipse.persistence.exceptions.DescriptorException异常   说明:无效的XPath   XMLDirectMapping / XMLCompositeDirectCollectionMapping。 XPath必须   或者包含属性的@符号,或者以/ text()结尾包含文本   节点。例如:" @ name"或"名称/文字()"制图:   org.eclipse.persistence.oxm.mappings.XMLDirectMapping [xlinkTitle2 - > NS2:标题]   描述符:XMLDescriptor(org.w3._1999.xlink.ArcType - >   [DatabaseTable(NS2:弧)])

     

运行时异常:

     

在   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.persistence.oxm.XMLContext。(XMLContext.java:194)     在   org.eclipse.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)     at 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版本&#34; JDK 6中的JAXB 2.1.10&#34; * java版本&#34; 1.6.0_38&#34; *

2 个答案:

答案 0 :(得分: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)

不确定这是否有帮助。

-Keith

答案 1 :(得分: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 for title(小写),而且我无法在任何相关的XSD中找到任何Title(大写)。

其次,当我跑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目录中。

  • 瑞克