3

使用 wsimport 时,如何在 WSDL 中为导入的 XSD 指定 JAXB 绑定?

我尝试了以下绑定,这会导致错误“//xs:element[@name='isFoobar'] 的 XPath 评估导致目标节点为空”。

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

有任何想法吗?

4

3 回答 3

2

抱歉,我遇到了这个问题,虽然这是在谷歌上出现的第一个答案之一,带有各种关键词组合,但它并没有得到我最终使用的答案。


对于导入的模式,在 WSDL 中对导入的 XSD 指定 JAXB 绑定的最简单方法是……将其视为完全不同的模式!

简短的例子:

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 的根目录还是在嵌套导入中),我需要编写的所有内容来在我的自定义绑定中绑定我的“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

(注意:在源代码中,解决方案似乎更复杂,所以我的案例可能比他们描述的更简单,我发现我的解决方案仍然使用它!)

于 2017-03-13T17:01:52.233 回答
1

我第一次尝试解决这个问题是试图以某种方式使用 XPath 或多个 jxb:binding 元素,但这不起作用。据我所知,XPath 只是没有针对导入的模式进行正确验证,除非它全部被重写并与 DOM 混合在一起。

所以我解决这个问题的方法是在导入的 XSD 中使用内联自定义。我没有使用多个嵌套导入来测试这种方法,但是如果您有访问权限和时间来修改所有导入的 XSD,这应该没问题。在我看来,这仅在您需要生成映射并且可以在映射完成后从 XSD 中清除/删除时才需要。

于 2011-09-23T13:05:36.720 回答
1

我很久以前做过类似的事情,我认为您需要使用 XPath 指定要选择的节点,如下所示:

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

或者将 xs:complexType 替换为您在此处使用的任何类型。希望它能解决您的问题。

于 2011-04-01T06:24:32.547 回答