将JAXB和JAXWS组合为导入的XML Schema

时间:2011-03-30 09:13:54

标签: wsdl xsd jaxb jax-ws wsimport

在使用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>

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

因此我解决此问题的方法是在导入的XSD中使用inline customizations。我没有使用多个嵌套导入来测试这种方法,但是如果你有权访问并且有时间修改所有导入的XSD,那么这应该没问题。在我看来,这只有在你需要生成映射时才有必要,并且一旦映射完成就可以从XSD中清除/删除。

答案 2 :(得分:1)

很抱歉,我遇到了这个问题,虽然这是谷歌出现在谷歌上的第一个答案之一,并且没有得到我最终使用的答案。

对于导入的模式,在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

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