3

タイトルにあるように、targetNamespace が定義されていないスキーマをどのようにインポートしますか?

次のケースがあります。

ファイル: Data.xml

<?xml version="1.0"?>
<lib:library xmlns:lib="http://java2s.com/ns/library">
  <lib:book id="b0836217462">
    <lib:title>Being a Dog Is a Full-Time Job</lib:title>
    <lib:authors>
      <person id="CMS">
        <name>Charles M Schulz</name>
      </person>
    </lib:authors>
  </lib:book>
</lib:library>

ファイル: schema.xsd

<?xml version="1.0"?>
<xs:schema targetNamespace="http://java2s.com/ns/library"
  elementFormDefault="qualified" attributeFormDefault="unqualified"
  xmlns:lib="http://java2s.com/ns/library"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import schemaLocation="another.xsd" />
  <xs:element name="library">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="book" type="lib:bookType" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="bookType">
    <xs:sequence>
      <xs:element name="title" type="xs:string" />
      <xs:element name="authors">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="person" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="id" type="xs:ID" use="required" />
  </xs:complexType>
</xs:schema>

ファイル: another.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="person" type="personType" />
  <xs:complexType name="personType">
    <xs:sequence>
      <xs:element name="name" type="xs:string" />
    </xs:sequence>
    <xs:attribute name="id" type="xs:ID" use="required" />
  </xs:complexType>
</xs:schema>

すべて問題ないように見えますが、これらの XSD の Jaxb クラスを生成しようとすると、次の例外が発生します。

org.xml.sax.SAXParseException: undefined element declaration 'person'
    at com.sun.xml.xsom.impl.parser.ParserContext$1.reportError(ParserContext.java:176)
    at com.sun.xml.xsom.impl.parser.NGCCRuntimeEx.reportError(NGCCRuntimeEx.java:170)
    at com.sun.xml.xsom.impl.parser.DelayedRef.resolve(DelayedRef.java:125)
    at com.sun.xml.xsom.impl.parser.DelayedRef.run(DelayedRef.java:100)
    at com.sun.xml.xsom.impl.parser.ParserContext.getResult(ParserContext.java:131)
    at com.sun.xml.xsom.parser.XSOMParser.getResult(XSOMParser.java:226)
    at com.sun.tools.xjc.ModelLoader.createXSOM(ModelLoader.java:519)
    at com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:236)
    at com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:85)
    at org.apache.cxf.tools.wsdlto.databinding.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:411)
    at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.generateTypes(WSDLToJavaContainer.java:603)
    at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.processWsdl(WSDLToJavaContainer.java:248)
    at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:142)
    at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:300)
    at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:103)
    at org.apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.java:113)
    at org.apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.java:86)
    at org.apache.cxf.maven_plugin.wsdl2java.WSDL2JavaMojo.generate(WSDL2JavaMojo.java:380)
    at org.apache.cxf.maven_plugin.AbstractCodegenMoho.execute(AbstractCodegenMoho.java:257)
    at org.apache.cxf.maven_plugin.wsdl2java.WSDL2JavaMojo.execute(WSDL2JavaMojo.java:477)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    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:320)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
    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.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)

ファイルに追加targetNamespaceしてファイル内another.xsdで修飾するとSchema.xsd問題は解決しますが、ファイル内の要素 person はDelta.xmlその targetNamespace にあり、これは私が望んでいるものではありません。

私の質問は基本的に: JAXB (または XJC) は、名前空間がないのに person 要素を認識しないのはなぜですか?

Jaxb の生成には、次を使用する cxf codegen プラグインを使用します: JAXB XJC のバージョン hudson-jaxb-ri-2.1-2

4

1 に答える 1

0

あなたが抱えている問題は、「名前空間のないxsdをインポートする」こととは何の関係もありません。記載されている XSD は問題ありません。person問題は、オブジェクトの XSD が解決されていない/見つからないため、読み込まれていないという点で、セットアップにある可能性が最も高いです。それがあなたのJAXBバージョンではないことを確認するには(非常に遠い可能性です)、コマンドラインからxjc/wsimportを呼び出してそこから取得します...

于 2013-01-08T12:35:42.380 に答える