2013-02-26 38 views
13

Wyrażenie XPath w moich plikach zewnętrznych wiążących nie można kierować elementy w moich schematów XML, które są importowane do mojego WSDL.Zastosowanie zewnętrznego pliku wiązania JAXB do schematu elementów importowanych z WSDL

Wszystko działa jeśli robię wiążące inline dostosowywania ale naprawdę chciałem mieć zewnętrznych plików wiążących w ten sposób nigdy nie przypadkowo nadpisać (odświeżania) Pliki zawierające moje dostosowania.

Początek mojego pliku wiązania:

<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']"> 

Moja WSDL zawiera:

<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> 

Bez względu na to, co robię XPath nie mogą znaleźć coś w XSD: import'ed schematów. Błąd pojawia się:

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

Próbowałem dostępu do xs: schema według numeru indeksu zamiast nazw i że nie działa. Wygląda na to, że moje wyrażenia XPath nie mogą dotrzeć do elementów z zaimportowanych schematów ... czy mimo to można to naprawić?

to jest Java SE 7 Projekt rozwijany pod NetBean 7.2. Używam NetBeans, aby zrobić wszystkie moje rzeczy wsimport, jeśli to ma znaczenie, ale wynik polecenia wygląda dość standardowo dla RI/Metro.

EDIT: Wyjaśniłem, że mogę uzyskać zewnętrzny plik wiążący do pracy, jeśli używam SCD. Ten przykład XPath nie działa:

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

Ale ten przykład z SCD robi.

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

Czy jest to znana rzecz, w której XPath nie działa w plikach xjb podczas używania wsimport, ale SCD robi?

+0

próbowałem tego. Ale teraz pojawia się następujący błąd "SCD" ~ tns: myelement "nie pasuje do żadnego komponentu schematu" – wib

Odpowiedz

4

Można kompilować każdy ze schematów XML do klas Java indywidualnie. Następnie możesz wykorzystać pliki odcinków, aby generowane klasy mogły być używane podczas kompilowania schematów, które importują ten schemat XML.

Poniżej znajduje się przykład tworzenia pliku z epizodami.

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

Poniżej znajduje się przykład sposobu spożywania pliku epizodu. Plik odcinka jest po prostu zewnętrznym plikiem powiązań JAXB i dlatego jest określony przy użyciu flagi -b.

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

Aby uzyskać więcej informacji

+2

Klasy nie są tak naprawdę ponownie wykorzystywane, więc nie mam potrzeby ich wstępnej kompilacji. Mimo to spróbowałem i zauważyłem, że pliki epizodów używają SCD zamiast XPath. Wygląda na to, że mogę użyć SCD w zewnętrznym pliku wiążącym. Przyznaję ci nagrodę, ponieważ twoja odpowiedź pomogła mi w pracy. – Chase

+1

Nie sugeruję, że nie powinieneś nagradzać nagrody; to twoja nagroda. Ale tak naprawdę nie jest to odpowiedź na to pytanie. – Cheeso

8

należy używać go jak:

<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> 

Bądź ostrożny z nazw

To wszystko jest wyjaśnione tutaj: https://jax-ws.java.net/nonav/2.1.2/docs/customizations.html

+1

Szukam dostosowywania artefaktów JAXB, a nie artefaktów JAX-WS. Nie próbowałem zmienić nazwy klasy usługi, próbuję zmienić złożone nazwy klas parametrów. Jeśli spojrzysz na http://docs.oracle.com/javase/6/docs/technotes/tools/share/wsimport.html zobaczysz, że wsimport -b może przyjmować plik powiązania JAX-WS lub JAXB. Próbuję użyć pliku powiązania JAXB. – Chase

+0

To wyglądało dobrze, ale z jakiegoś powodu XPath nie wybierze żadnych węzłów. W jaki sposób debugujesz wynik XPath za pomocą (w środku) tego narzędzia? Jak mam to powiedzieć - "wydrukuj wszystko, co widzisz"? _Update_: Znalazłem błąd w moim powiązaniu, używałam 'jaxb: bindings' zamiast' jaxb: schemaBindings'. Kompilacja XPath teraz. – aliopi

+0

Że _java.net_-URL nie działa, czy miałeś na myśli https://javaee.github.io/meto-jax-ws/doc/user-guide/ch03.html#users-guide-wsdl-customization? – aliopi

0

Dla nowych ludzi, możesz po prostu użyć dwa pliki, jeden wiążących stosowanych do WSDL i innych stosowanych w schemacie za pomocą opcji -b wsdl2java klasa CXF generowania kodu akceptuje wiele plików Oprawa:

<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> 

Treść pliku 'JAXWS-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> 

Treść 'JAXB-bindings.xml':

<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

Dodanie tej sekcji mojej konfiguracji JAXB pomógł pozbyć się podobnego błędu:

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

pełną konfigurację:

<?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> 

punktów: