2014-10-16 181 views
2

我有一个架构,其中JAXB每次都能够完美地生成java类。我试图让hyperjaxb处理相同的模式。为此,我下载并解压缩了hyperjaxb maven项目from this link,然后使用cmd.exe 导航到根目录,并通过运行mvn clean install以确保它与示例模式一起使用示例数据对其进行测试。然后,我用JAXB完美工作完整的shema替换了schema.xsd,po.xmlbindings.xjb文件,其中包括一些导入的命名空间。然后我再次运行mvn clean install。不过,我收到以下错误消息:不受支持的绑定名称空间“”

[ERROR] Error while parsing schema(s).Location [ file:/C:/path/to/src/main/resources/schema.xsd{4,32}]. 
org.xml.sax.SAXParseException; systemId: file:/C:/path/to/src/main/resources/schema.xsd; 
lineNumber: 4; columnNumber: 32; Unsupported binding namespace "". 
Perhaps you meant "http://annox.dev.java.net"? 

在示例中,在schema.xsd顶端的架构标签:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="1.0"> 

与此相反,我的自定义模式使用:

<xs:schema targetNamespace="urn:some-org:v3" xmlns:mif="urn:some-org:v3/mif" xmlns="urn:some-org:v3" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
    xmlns:sdtc="urn:some-org:sdtc" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="1.0"> 

请注意我的自定义架构中架构标记中的xmlns="urn:some-org:v3"。它不包括像xmlns:somequalifier="urn:some-org:v3"这样的限定符。这是造成这个问题吗?它在没有限定符的JAXB中完美工作。遍历整个名称空间并在每种类型前添加一个限定符将是一个主要的痛苦。

或者,可能是在示例项目的pom.xml中定义的结构(在上面链接的zip文件中)导致了问题。它们与基本的JAXB工具不同。

我该如何避免这个问题?最好不添加每个类型的限定符。我的模式中有几千行。

堆栈跟踪的以下行可能揭示:

[ERROR] Error while parsing schema(s).Location [ file:/C:/path/to/src/main/resources/schema.xsd{4,32}]. 
org.xml.sax.SAXParseException; systemId: file:/C:/path/to/src/main/resources/schema.xsd; lineNumber: 4; columnNumber: 32; Unsupported binding namespace "". Perhaps you meant "http://annox.dev.java.net"? 
    at com.sun.tools.xjc.reader.AbstractExtensionBindingChecker.error(AbstractExtensionBindingChecker.java:213) 
    at com.sun.tools.xjc.reader.AbstractExtensionBindingChecker.checkAndEnable(AbstractExtensionBindingChecker.java:115) 
    at com.sun.tools.xjc.reader.ExtensionBindingChecker.startElement(ExtensionBindingChecker.java:133) 
    at org.xml.sax.helpers.XMLFilterImpl.startElement(XMLFilterImpl.java:551) 
    at com.sun.tools.xjc.reader.xmlschema.parser.IncorrectNamespaceURIChecker.startElement(IncorrectNamespaceURIChecker.java:128) 
    at org.xml.sax.helpers.XMLFilterImpl.startElement(XMLFilterImpl.java:551) 
    at com.sun.tools.xjc.reader.xmlschema.parser.CustomizationContextChecker.startElement(CustomizationContextChecker.java:193) 
    at org.xml.sax.helpers.XMLFilterImpl.startElement(XMLFilterImpl.java:551) 
    at com.sun.tools.xjc.reader.internalizer.DOMForestScanner$LocationResolver.startElement(DOMForestScanner.java:147) 
    at com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:244) 
    at com.sun.xml.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:127) 
    at com.sun.tools.xjc.reader.internalizer.DOMForestScanner.scan(DOMForestScanner.java:92) 
    at com.sun.tools.xjc.reader.internalizer.DOMForestScanner.scan(DOMForestScanner.java:100) 
    at com.sun.tools.xjc.reader.internalizer.DOMForestParser.parse(DOMForestParser.java:104) 
    at com.sun.tools.xjc.ModelLoader$XMLSchemaParser.parse(ModelLoader.java:269) 
    at com.sun.xml.xsom.impl.parser.NGCCRuntimeEx.parseEntity(NGCCRuntimeEx.java:347) 
    at com.sun.xml.xsom.impl.parser.ParserContext.parse(ParserContext.java:128) 
    at com.sun.xml.xsom.parser.XSOMParser.parse(XSOMParser.java:168) 
    at com.sun.xml.xsom.parser.XSOMParser.parse(XSOMParser.java:157) 
    at com.sun.tools.xjc.ModelLoader.createXSOM(ModelLoader.java:534) 
    at com.sun.tools.xjc.ModelLoader.loadXMLSchema(ModelLoader.java:378) 
    at com.sun.tools.xjc.ModelLoader.load(ModelLoader.java:174) 
    at com.sun.tools.xjc.ModelLoader.load(ModelLoader.java:119) 
    at org.jvnet.mjiip.v_2_2.XJC22Mojo.loadModel(XJC22Mojo.java:50) 
    at org.jvnet.mjiip.v_2_2.XJC22Mojo.doExecute(XJC22Mojo.java:40) 
    at org.jvnet.mjiip.v_2_2.XJC22Mojo.doExecute(XJC22Mojo.java:28) 
    at org.jvnet.jaxb2.maven2.RawXJC2Mojo.doExecute(RawXJC2Mojo.java:318) 
    at org.jvnet.jaxb2.maven2.RawXJC2Mojo.execute(RawXJC2Mojo.java:161) 
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:106) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:317) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:152) 
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:555) 
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:214) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:158) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    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) 
+0

您可以添加所有涉及的xsd吗?抱歉,这个问题对我来说不是很清楚。 – Xstian 2014-10-16 21:13:17

+0

@Xstian我把整个'resources'目录,包括所有'xsd',上传到一个zip文件。我怀疑'codehaus。mojo'插件是问题,但我不确定。这里是链接:https://jumpshare.com/v/QsE0KEFiUV2CyMvneoJ9?b=7JBK9muM8YTIqVmwoItO – CodeMed 2014-10-16 21:17:15

+0

@ Xstian你需要一个xml文件来匹配xsd吗? – CodeMed 2014-10-16 21:37:08

回答

3

,你看到的是由于缺少前缀的标签<property name="xsid"/>错误。正确的标签低于

<jaxb:bindings node="//xs:complexType[@name='Section']/xs:attribute[@name='ID']"> 
    <jaxb:property name="xsid"/> 
</jaxb:bindings> 

反正你的XSD有一些问题,因为通过maven-jaxb2-plugin可以生成所有的类和maven-hyperjaxb3-plugin是不可能的。


我建议解决您的整个问题。如果您不需要标记@Entity或@Table生成的所有类,则可以使用下面的配置。

XJB

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<jaxb:bindings 
    version="2.1" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:annox="http://annox.dev.java.net" > 

    <jaxb:bindings schemaLocation="schema.xsd" node="/xs:schema"> 
     <jaxb:globalBindings generateIsSetMethod="true"/> 
     <jaxb:schemaBindings> 
      <jaxb:package name="org.jvnet.hyperjaxb3.ejb.tests.pocustomized"/> 
     </jaxb:schemaBindings> 
     <jaxb:bindings node="//xs:complexType[@name='InfrastructureRoot.typeId']"> 
      <annox:annotate> 
       <annox:annotate annox:class="javax.persistence.Entity"> 
       </annox:annotate> 
       <annox:annotate annox:class="javax.persistence.Table" name="typeId"> 
       </annox:annotate> 
      </annox:annotate> 
     </jaxb:bindings> 
     <jaxb:bindings node="//xs:complexType[@name='ObservationMedia']/xs:attribute[@name='ID']"> 
      <jaxb:property name="xsid"/> 
     </jaxb:bindings> 
     <jaxb:bindings node="//xs:complexType[@name='RegionOfInterest']/xs:attribute[@name='ID']"> 
      <jaxb:property name="xsid"/> 
     </jaxb:bindings> 
     <jaxb:bindings node="//xs:complexType[@name='Section']/xs:attribute[@name='ID']"> 
      <jaxb:property name="xsid"/> 
     </jaxb:bindings> 


    </jaxb:bindings> 

</jaxb:bindings> 

Maven插件

<plugin> 
    <groupId>org.jvnet.jaxb2.maven2</groupId> 
    <artifactId>maven-jaxb2-plugin</artifactId> 
    <version>0.8.1</version> 
    <executions> 
     <execution> 
      <phase>generate-sources</phase> 
      <goals> 
       <goal>generate</goal> 
      </goals> 
     </execution> 
    </executions> 
    <dependencies> 
     <dependency> 
      <groupId>org.hibernate.javax.persistence</groupId> 
      <artifactId>hibernate-jpa-2.0-api</artifactId> 
      <version>1.0.1.Final</version> 
     </dependency> 
    </dependencies> 
    <configuration> 
     <args> 
      <arg>-Xannotate</arg> 
      <arg>-nv</arg> 
     </args> 
     <extension>true</extension> 
     <schemaDirectory>src/main/resources/</schemaDirectory> 
     <schemaIncludes> 
      <schemaInclude>schema.xsd</schemaInclude> 
     </schemaIncludes> 
     <bindingDirectory>src/main/resources/</bindingDirectory> 
     <bindingIncludes> 
      <include>*.xjb</include> 
     </bindingIncludes> 
     <debug>true</debug> 
     <verbose>true</verbose> 
     <episode>true</episode> 
     <forceRegenerate>true</forceRegenerate> 
     <plugins> 
      <plugin> 
       <groupId>org.jvnet.jaxb2_commons</groupId> 
       <artifactId>jaxb2-basics</artifactId> 
       <version>0.6.3</version> 
      </plugin> 
      <plugin> 
       <groupId>org.jvnet.jaxb2_commons</groupId> 
       <artifactId>jaxb2-basics-annotate</artifactId> 
       <version>0.6.3</version> 
      </plugin> 
     </plugins> 
    </configuration> 
</plugin> 

是不是最好的做法,但工作得很好。

+0

Hyperjaxb允许忽略类OOTB:http://confluence.highsource.org/display/HJ3/Customization+Guide#CustomizationGuide-Ignoringclasses 使用'annotate'插件可以工作,但有一定的局限性。一些生成的结构不是JPA兼容的,Hyperjaxb大多重构它们。 'annotate'插件不能这样做。见http://confluence.highsource.org/display/HJ3/Reference+-+single+page#Reference-singlepage-TaskssolvedbyHyperjaxb3 – lexicore 2014-10-17 13:48:01

+0

@Xstian非常感谢您对此进行调查。我删除了'bindings.xjb'的内容,然后我将你的内容逐字地写入'bindings.xjb'。接下来,我将您的插件标签添加到'pom.xml'中,以创建您可以在此链接中阅读的'pom.xml':https://jumpshare.com/v/MUvit4oWZqBlPPXFLM1g?b=D09y0Bld0v99GBP7kASX但是我得到当我尝试在项目的根目录下执行'mvn clean install'时出现以下错误日志:https://jumpshare.com/v/GpM69nFzhPIgQmAvqJrb?b=D09y0Bld0v99GBP7kASX我是否正确实施了您的建议? – CodeMed 2014-10-17 16:25:25

+0

@ Xstian +1,谢谢你帮助我。您提出的代码会产生与设置'-Xannotate'开关相关的新错误。我已将新错误作为单独问题发布。你愿意帮助我吗?这里是链接:http://stackoverflow.com/questions/26430199/http-annox-dev-java-net-customizations-requires-the-xannotate-switch – CodeMed 2014-10-17 17:22:47

相关问题