需要使用自定义类而不是在Web服务中生成(通过wsimport)

时间:2010-06-02 18:04:13

标签: java web-services jaxb wsimport

请帮助解决以下问题?

当生成WS客户端代码(使用wsimport ant任务)时,所有类都在与Web服务相同的包(例如helloservice.endpoint)中自动生成,例如,如果我的网络服务有方法

public Node getNode();

生成类helloservice.endpoint.Node。 不过,我有自己的helloservice.Node类,我想在web服务中使用。

我定义了bind.xml文件:


<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" >
    <bindings node="wsdl:definitions/wsdl:portType[@name='Node']">
        <class name="helloservice.Node"/>
    </bindings>
</bindings>

and pass it to wsimport task as binding parameter, but get the error :

 [wsimport] [ERROR] XPath evaluation of "wsdl:definitions/wsdl:portType[@name='Node']" results in empty target node
 [wsimport]   line 2 of file:/C:/work/projects/svn.ct/trunk/jwstutorial20/examples/jaxws/simpleclient/bind.xml

请问有人可以推荐这里有什么问题吗? 我可以用这种方式在生成的Web服务类中使用我自己的类,还是需要更复杂的smth?

提前致谢。

1 个答案:

答案 0 :(得分:5)

要从wsdl生成类,请在ant:

中使用

<taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport">
<wsimport keep="true" sourcedestdir="..." wsdl="..." wsdllocation="..." xnocompile="true" />

不要在wsimport ant任务上使用'package'属性,因此所有类都是在正确的包中创建的。

通常,要自定义包,即将生成的包名称a.b.c更改为名称x.y.z,将元素添加到wsimport任务并定义binding.jxb文件,如下所示。


<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jxb:bindings schemaLocation="schema-for-a.b.c.xsd" node="/xs:schema">
        <jxb:schemaBindings>
            <jxb:package name="x.y.z" />
        </jxb:schemaBindings>
    </jxb:bindings>
</jxb:bindings>

其中schema-for-a.b.c.xsd是由wsgen任务生成的模式(使用合适的方案创建wsdl)。

有关JAXB自定义的详细信息:http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/JavaWSTutorial.pdf,“自定义JAXB绑定”部分