Объедините JAXB и JAXWS для импортированной XML-схемы - PullRequest
2 голосов
/ 30 марта 2011

Как указать привязку JAXB для импортированного XSD в WSDL при использовании wsimport?

Я попытался выполнить следующее связывание, которое вызывает ошибку «Оценка XPath // xs: element [@ name = 'isFoobar '] приводит к пустому целевому узлу ".

<?xml version="1.0" encoding="UTF-8"?>
<jaxws:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" wsdlLocation="example.wsdl"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
    <jaxws:bindings node="wsdl:definitions">
        <jaxws:bindings node="wsdl:types" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
            <jaxws:bindings
                node="//xs:schema[@targetNamespace='http://www.example.org/']">
                <jaxb:globalBindings>
                    <xjc:serializable uid="10000001" />
                </jaxb:globalBindings>
                <jaxb:bindings
                    node="//xs:element[@name='isFoobar']">
                    <jaxb:typesafeEnumClass name="IsFoobar">
                        <jaxb:typesafeEnumMember value="01" name="TRUE" />
                        <jaxb:typesafeEnumMember value="02" name="FALSE" />
                    </jaxb:typesafeEnumClass>
                </jaxb:bindings>
            </jaxws:bindings>
        </jaxws:bindings>
    </jaxws:bindings>
</jaxws:bindings>

Есть идеи?

Ответы [ 3 ]

1 голос
/ 23 сентября 2011

Моя первая попытка решить эту проблему - попытаться каким-то образом использовать XPath или несколько элементов jxb: binding, но это не сработало. Насколько я знаю, XPath просто не проверяется должным образом по отношению к импортированным схемам, если он не будет переписан и объединен с DOM.

Таким образом, я решил эту проблему, используя встроенные настройки в импортированном XSD. Я не тестировал этот подход с несколькими вложенными импортами, но если у вас есть доступ и время для изменения всех импортированных XSD, это должно сработать нормально. По моему мнению, это необходимо только в том случае, если вам нужно сгенерировать сопоставление, и его можно удалить / удалить из XSD после завершения сопоставления.

1 голос
/ 13 марта 2017

Извините за necro-threading, я столкнулся с этой проблемой, и хотя это один из первых ответов, который появился в Google с различными комбинациями ключевых слов, он не содержал ответ, который я в конечном итоге использовал.


Для импортированных схем самый простой способ указать привязку JAXB для импортированного XSD в WSDL - это ... рассматривать его как совершенно другую схему!

Краткий пример:

MyXSD.xsd

<xsd:schema targetNamespace="whatever"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="ThingThatNeedsToBeBound">
        <!-- Whatever this is made of -->
    </xs:complexType>
</xsd:schema>

Независимо от того, куда импортирован этот xsd (находится ли он в корне моего wsdl или во вложенном импорте), все, что мне нужно написать вbind my "ThingThatNeedsToBeBound" в моей пользовательской привязке:

customBindings.xml

<jaxb:bindings schemaLocation="Path/To/MyXSD.xsd" node="/xs:schema/xs:complexType[@name='ThingThatNeedsToBeBound']">
    <!-- your custom binding -->
</jaxb:bindings>

Итак, это как обычный случай, за исключением того, что вы указываете schemaLocation, но тогда вы можете рассматривать импортированную схему как единое целое, а не как часть чего-либо.

Надеюсь, это поможет другим людям наткнуться на эту проблему.


Источник: http://www.oracle.com/technetwork/articles/grid/jax-ws-jaxb-customization-082750.html

(Примечание: в источнике решение кажется более сложным, поэтому мой случай, возможно, был проще, чем то, что они описали, но я нашел свое решение, используя это!)

1 голос
/ 01 апреля 2011

Я делал нечто похожее много лет назад, я думаю, вам нужно указать узел для выбора с XPath следующим образом:

//xs:element[@name='isFoobar']/xs:complexType

Или замените xs: complexType типом, который вы здесь используете. Надеюсь, это исправит вашу проблему.

...