2013-02-26 12 views
13

外部バインディングファイルのXPath式は、自分のWSDLにインポートされるXMLスキーマの要素をターゲットにできません。WSDLからインポートされたスキーマ要素への外部JAXBバインディングファイルの適用

私はインラインバインディングのカスタマイズを実行するとすべてが実行されますが、実際に私のカスタマイズを含むファイルを誤って上書き(リフレッシュ)することはありません。

私のバインディングファイルの先頭:

<jaxb:bindings 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
    version="2.1"> 
    <jaxb:bindings schemaLocation="../wsdl/localhost_7001/ExampleSessionBean/ExampleSessionBeanService.wsdl#types?schema1"> 
     <jaxb:bindings node="//xs:schema[@targetNamespace='urn:myExample']"> 

私のWSDLが含まれていますimport'edスキーマ:

<types> 
<xsd:schema> 
<xsd:import namespace="urn:myExample" schemaLocation="http://localhost:7001/ExampleSessionBean/ExampleSessionBeanService?xsd=1"/> 
</xsd:schema> 
<xsd:schema> 
<xsd:import namespace="http://ejbs/" schemaLocation="http://localhost:7001/ExampleSessionBean/ExampleSessionBeanService?xsd=2"/> 
</xsd:schema> 
</types> 

がどんなに私は何をすべきかXPathは、XSDで何かを見つけることはできません。私が手にエラーがある:私はXSにアクセスしようとした

[ERROR] XPath evaluation of "//xs:schema[@targetNamespace='urn:myExample']" results in empty target node 

:インデックス番号の代わりに、名前空間でスキーマをし、それはどちらか動作しません。私のXPath式は、インポートされたスキーマの要素に到達できないようです...これを修正するにはどうしますか?

これは、NetBean 7.2で開発されているJava SE 7プロジェクトです。 NetBeansを使ってすべてのwsimportを実行していますが、コマンド出力はRI/Metroの標準となります。

EDIT: SCDを使用すると、外部バインディングファイルが動作するようになることがわかりました。このXPathの例は機能しません。

<bindings node="//xsd:schema[@targetNamespace='urn:myExample']"> 
    <bindings node="//xs:complexType[@name='myType']"> 
     <class name="MyClass"/> 
    </bindings> 
</bindings> 

ただし、このSCDの例は動作します。

<bindings scd="x-schema::tns" xmlns:tns="urn:myExample"> 
    <bindings scd="~tns:myType"> 
     <class name="MyClass"/> 
    </bindings> 
</bindings> 

これは既知のことですが、wsimportを使用していてもSCDではXPathはxjbファイルでは機能しません。

+0

私はこれを試してみました。しかし、今私は次のエラー 'SCD '〜tns:myelement"スキーマのコンポーネントと一致しませんでした。 " – wib

答えて

4

それぞれのXMLスキーマをJavaクラスに個別にコンパイルできます。次に、エピソードファイルを利用して、そのXMLスキーマをインポートするスキーマをコンパイルするときに生成されたクラスを使用できるようにします。

以下は、エピソードファイルを作成する方法の例です。

xjc -b binding1.xml -episode common.episode common.xsd 

以下は、ファイルをどのように使用してエピソードするかの例です。エピソードファイルは単なるJAXB外部バインディングファイルなので、-bフラグを使用して指定します。

xjc -d out main.xsd -extension -b common.episode 

詳細情報

+2

クラスは実際には再利用されないので、それらをプリコンパイルする必要はありません。とにかく試してみましたが、エピソードファイルがXPathではなくSCDを使用していることに気付きました。私は外部バインディングファイルでSCDを使用できるようです。あなたの答えが私の周りの仕事で私を助けたので、あなたに報奨金を与えてください。 – Chase

+1

私はあなたが賞金を授与すべきではないと言っているわけではありません。あなたの恩恵です。しかし、これは本当に質問に対する答えではありません。 – Cheeso

8

が好き、それを使用する必要があります。

<jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http://duke.example.org']"> 
    <jaxb:schemaBindings> 
     <jaxb:package name="fromwsdl.server"/> 
    </jaxb:schemaBindings> 
</jaxws:bindings> 

は、名前空間

には注意してください

それはすべてがここで説明されています。新しい人々のために https://jax-ws.java.net/nonav/2.1.2/docs/customizations.html

+1

私はJAX-WSアーチファクトではなく、JAXBアーチファクトをカスタマイズしようとしています。私はサービスクラス名を変更しようとしていません、私は複雑なパラメータクラス名を変更しようとしています。 http://docs.oracle.com/javase/6/docs/technotes/tools/share/wsimport.htmlを見ると、wsimport -bはJAX-WSまたはJAXBバインディング・ファイルのいずれかを使用できることがわかります。 JAXBバインディングファイルを使用しようとしています。 – Chase

+0

これはまず最初に見えましたが、何らかの理由でXPathがノードを選択しません。このツールを使用してXPathの結果をどのようにデバッグしますか?どのように私はそれを_ "あなたが見るすべてを印刷する_"と言いますか? _Update_:バインディングに間違いがあり、 'jaxb:schemaBindings'の代わりに' jaxb:bindings'を使用していました。 XPathがコンパイルされます。 – aliopi

+0

_java.net_-URLが機能しません。https://javaee.github.io/metro-jax-ws/doc/user-guide/ch03.html#users-guide-wsdl-customizationを意味しましたか? – aliopi

0

を、あなたは、単に二つの結合ファイルを使用することができ、一つはWSDL2JavaのCXFコード生成クラスの-bオプションを使用してスキーマにWSDLやその他の応用に受け入れ適用複数の結合のファイル:ファイル 'JAXWS-bindings.xmlに' の

<java classname="org.apache.cxf.tools.wsdlto.WSDLToJava" fork="true"> 
    <arg value="-d"/> 
    <arg value="${src}"/> 
    <arg value="-b"/> 
    <arg value="${wsdl.home}\jaxws-bindings.xml"/> 
    <arg value="-b"/> 
    <arg value="${wsdl.home}\jaxb-bindings.xml"/> 
    <arg value="${wsdl.home}\YOUR_WSDL.wsdl"/> 
    <classpath> 
     <path refid="cxf.classpath"/> 
    </classpath> 
</java> 

内容: 'JAXB-bindings.xmlに' の

<jaxws:bindings wsdlLocation="YOUR_WSDL.wsdl" 
       xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
       xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle> 
</jaxws:bindings> 

内容:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       jaxb:version="2.0"> 
    <jaxb:bindings schemaLocation="ManagePartyCustomerDataManagement_PARTY_G7-IOP_In_1.0.xsd"> 
     <jaxb:bindings node="//xsd:element[@name='eventDate']"> 
      <jaxb:javaType name="java.util.Date" 
         parseMethod="com.sofrecom.gaia.ebs.provider.utils.jaxb.StringDateAdapter.parseDate" 
         printMethod="com.sofrecom.gaia.ebs.provider.utils.jaxb.StringDateAdapter.printDate" /> 
    </jaxb:bindings> 

0

同様のエラーを廃止するのに役立った私のJAXBの設定に、このセクションの追加:

<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"> 
    <jaxws:enableWrapperStyle>true</jaxws:enableWrapperStyle> 
    <jaxws:enableAsyncMapping>false</jaxws:enableAsyncMapping> 
</jaxws:bindings> 

完全な構成:

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings version="2.1" 
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
       xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"> 
     <jaxws:enableWrapperStyle>true</jaxws:enableWrapperStyle> 
     <jaxws:enableAsyncMapping>false</jaxws:enableAsyncMapping> 
    </jaxws:bindings> 

    <jaxb:bindings schemaLocation="ContactService.wsdl" node="/wsdl:definitions/wsdl:types/xs:schema"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="za.org.kuali.kfs.sys.integration.iapi.contactservice"/> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 

</jaxb:bindings> 

クレジット:

関連する問題