необходимо использовать пользовательские классы вместо сгенерированных (wsimport) в веб-сервисах - PullRequest
4 голосов
/ 02 июня 2010

Не могли бы вы помочь со следующей проблемой?

Когда генерируется клиентский код WS (с помощью Ant-задачи wsimport), все классы генерируются автоматически в том же пакете (например, helloservice.endpoint), что и веб-сервис, например если у моего веб-сервиса есть метод

публичный узел getNode ();

поэтому генерируется класс helloservice.endpoint.Node. Тем не менее, у меня есть свой собственный класс helloservice.Node, который я хочу использовать в веб-сервисе.

Я определил файл bind.xml:

<code>
<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=&#39;Node&#39;]">
        <class name="helloservice.Node"/>
    </bindings>
</bindings>

и передать его в задачу wsimport в качестве параметра привязки, но получите ошибку:

 [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
</code>

Может ли кто-нибудь, пожалуйста, порекомендовать, что здесь не так? Могу ли я использовать свои собственные классы в сгенерированных классах веб-сервисов таким образом, или мне нужно что-то более сложное?

Заранее спасибо.

1 Ответ

5 голосов
/ 22 июня 2010

Чтобы сгенерировать классы из wsdl, используйте в ant:


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

Не используйте атрибут package в задаче wsimport ant, поэтому все классы создаются в правильных пакетах.

Как правило, для настройки пакета измените имя сгенерированного пакета 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"

...