根据以下回复使用我的最新示例更新此信息。
我正在尝试使用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; *
答案 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 <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目录中。