Вот уже долгое время в качестве клиента для веб-сервисов использую самый простой Axis, и этого вполне хватало, однако столкнулся с проблемой что JAX-WS веб-сервис, возвращающий массив своих объектов перестал правильно "распознаваться" axis'овским клиентом.
AxisFault!
Все таки, для JAX-WS сервиса требуется и jAX-WS клиент!
Eclipse FAQ рекомендует для этого использовать фреймворк CXF:
Generate a JAX-WS Web Service Client from a WSDL document using Apache CXF
однако, вовсе необязательно использовать тяжелый фреймворк для этого, можно решить проблему проще:
1) Сгенерировать при попощи wsimport:
wsimport -s src/ -d bin/ SeaIntService.wsdl
В качестве wsdl location можно прямо указать url, но в моем случае была переброска портов и адрес endpoint'а отличался от прописанного в wsdl, поэтому я скачивал wsdl заранее:
wget http://sea:9084/SeaIntService/SeaIntService/SeaIntService.wsdl
wget http://sea:9084/SeaIntService/SeaIntService/SeaIntService_schema1.xsd
2) Скрипт ant:
По той же причине я сперва скачиваю wsdl, а уже потом запускаю wsimport.
Для com.sun.tools.ws.ant.WsImport потребуется jax-ws фреймворк (jaxws-tools.jar), я взял его с https://jax-ws.java.net
Вот и все!
maven sample:
https://java.net/projects/jax-ws-commons/sources/svn/show
AxisFault!
Все таки, для JAX-WS сервиса требуется и jAX-WS клиент!
Eclipse FAQ рекомендует для этого использовать фреймворк CXF:
Generate a JAX-WS Web Service Client from a WSDL document using Apache CXF
однако, вовсе необязательно использовать тяжелый фреймворк для этого, можно решить проблему проще:
1) Сгенерировать при попощи wsimport:
wsimport -s src/ -d bin/ SeaIntService.wsdl
В качестве wsdl location можно прямо указать url, но в моем случае была переброска портов и адрес endpoint'а отличался от прописанного в wsdl, поэтому я скачивал wsdl заранее:
wget http://sea:9084/SeaIntService/SeaIntService/SeaIntService.wsdl
wget http://sea:9084/SeaIntService/SeaIntService/SeaIntService_schema1.xsd
2) Скрипт ant:
<taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport">
<classpath>
<pathelement location="jaxws/jaxws-tools.jar" />
</classpath>
</taskdef>
...
<target depends="clean, init" name="generate-JAX-WS-client" description="Generates JAX-WS files from the wsdl files">
<get src="http://sea:9084/SeaIntService/SeaIntService/SeaIntService.wsdl" dest="" />
<get src="http://sea:9084/SeaIntService/SeaIntService/SeaIntService_schema1.xsd" dest="" />
<delete dir="${basedir}/src/com/sitronics/ws" />
<wsimport debug="true"
xendorsed="true"
verbose="${verbose}"
keep="true"
sourcedestdir="${basedir}/src"
destdir="${basedir}/bin"
package="com.sitronics.ws"
wsdl="${wsdl.dir}/SeaIntService.wsdl"
target = "2.0" >
</wsimport>
</target>
По той же причине я сперва скачиваю wsdl, а уже потом запускаю wsimport.
Для com.sun.tools.ws.ant.WsImport потребуется jax-ws фреймворк (jaxws-tools.jar), я взял его с https://jax-ws.java.net
Вот и все!
String url = "http://sea:9084/SeaIntService/SeaIntService";
URL wsdlLocation = new URL(url.concat("/SeaIntService.wsdl"));
QName qname = new QName("http://ws.sitronics.com/", "SeaIntService");
SeaIntService service = new SeaIntService(wsdlLocation, qname);
SeaInt seaInt = service.getSeaIntPort();
// Use the BindingProvider's context to set the endpoint
BindingProvider bp = (BindingProvider) seaInt;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);
List<PdfDocument> pdfs = seaInt.getPdfDocuments("{D3ED8387-1A95-4032-9B20-0216ADA310EE}");
Update (11.11.2013):
maven sample:
Источник:4.0.0 org.jvnet.jax-ws-commons mojo.it.Chebiwebservices 1.0-SNAPSHOT Chebiwebservices UTF-8 2.3 2.2.8 com.sun.xml.ws jaxws-rt ${jaxws-ri.version} maven-compiler-plugin 2.3.2 1.5 1.5 org.jvnet.jax-ws-commons jaxws-maven-plugin ${jaxws.plugin.version} wsimport http://www.ebi.ac.uk/webservices/chebi/2.0/webservice?wsdl false
https://java.net/projects/jax-ws-commons/sources/svn/show