Подтвердить что ты не робот

Применение внешнего файла привязки JAXB к элементам схемы, импортированным из WSDL

Выражение XPath в моих внешних файлах привязки не может ориентироваться на элементы в моих XML-схемах, которые импортируются в мой WSDL.

Все выполняется, если я выполняю встроенную привязку привязки, но я действительно хотел иметь внешние файлы привязки таким образом, чтобы я никогда случайно не перезаписывал (обновлять) файлы, содержащие мои настройки.

Начало моего файла привязки:

<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 есть:

<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: import'ed. Ошибка, которую я получаю:

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

Я пробовал доступ к xs: schema по номеру индекса вместо пространства имен, и это тоже не работает. Похоже, что мои выражения XPath не могут достигать элементов из импортированных схем... есть ли способ исправить это?

Это проект Java SE 7, разработанный под NetBean 7.2. Я использую 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>

Известно ли это, что XPath не работает в xjb файлах при использовании wsimport, но SCD ​​делает?

4b9b3361

Ответ 1

вы должны использовать его как:

<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

Ответ 2

Вы можете скомпилировать каждую из схем XML для классов Java отдельно. Затем вы можете использовать файлы эпизодов, чтобы сгенерированные классы могли использоваться при компиляции схем, которые импортируют эту XML-схему.

Ниже приведен пример того, как вы создаете файл эпизода.

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

И ниже приведен пример того, как вы потребляете и файл эпизода. Файл эпизода является только внешним файлом привязки JAXB и поэтому указан с использованием флага -b.

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

Дополнительная информация

Ответ 3

Для новых пользователей вы можете просто использовать два файла привязки, один из которых применяется к wsdl и другому, примененному к схеме, с помощью опции -b класса генерации кода wsdl2java cxf принимает несколько файлов привязки:

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

Содержимое файла '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>

Содержимое '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>

Ответ 4

Добавление этого раздела в мою конфигурацию 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>

Credits: