Привет всем!
Мне необходимо написать клиента на Java для SOAP сервиса. Желательно сделать это в NetBeans, так как на изучение другой IDE вмремени нет, по крайней мере пока.
Пытался погуглить, но что-то ничего вразумительного так и не нашёл.
Опишу пошагово мои действия:
1. Устанавливаю в NetBeans 6.5 плугин JAX-RPC. 2. Создаю новый проект. 3. Жму правок кнопкой по узлу проекта -> New -> Web Service Client 3.1 В открывшемся диалоге, выбираю WSDL url и указываю его, если кому интересно вот он: http://www.kapaza.com/soap/webservice_1_0.cfc?wsdl 3.2 В Client style выбираю JAX-RPC Style. 3.3 В Package указываю пакет com.kapaza 3.4 Жму кнопку Finish.
После добавляю в проект класс KapazaService импортирую в него пакет com.kapaza.*, во время разработки мне видны открытые члены сервиса и казалось бы жизнь наладилась, но как говорится: хорошее не длится долго. :( Когда запускаю программу то получаю такой OUTPUT:
| Цитата | run: 18-jun-2009 12:15:17 ServiceKapaza getCats SEVERE: null java.rmi.RemoteException: Runtime exception; nested exception is: deserialization error: unexpected XML reader state. expected: END but found: START: ResultMeta at com.sun.xml.rpc.client.StreamingSender._handleRuntimeExceptionInSend(StreamingSender.java:331) at com.sun.xml.rpc.client.StreamingSender._send(StreamingSender.java:313) at com.kapaza.PortTypes_Stub.getCategories(PortTypes_Stub.java:906) at ServiceKapaza.getCats(ServiceKapaza.java:31) at ServiceKapaza.main(ServiceKapaza.java:15) Caused by: deserialization error: unexpected XML reader state. expected: END but found: START: ResultMeta at com.sun.xml.rpc.encoding.ObjectSerializerBase.deserialize(ObjectSerializerBase.java:233) at com.sun.xml.rpc.encoding.ReferenceableSerializerImpl.deserialize(ReferenceableSerializerImpl.java:155) at com.kapaza.PortTypes_GetCategories_ResponseStruct2_SOAPSerializer.doDeserialize(PortTypes_GetCategories_ResponseStruct2_SOAPSerializer.java:43) at com.sun.xml.rpc.encoding.ObjectSerializerBase.deserialize(ObjectSerializerBase.java:192) at com.sun.xml.rpc.encoding.ReferenceableSerializerImpl.deserialize(ReferenceableSerializerImpl.java:155) at com.kapaza.PortTypes_Stub._deserialize_GetCategories(PortTypes_Stub.java:2564) at com.kapaza.PortTypes_Stub._readFirstBodyElement(PortTypes_Stub.java:2303) at com.sun.xml.rpc.client.StreamingSender._send(StreamingSender.java:228) ... 3 more BUILD SUCCESSFUL (total time: 2 seconds)
|
Собственно в файле ServiceKapaza я из метода main вызываю метод getCats(), который уже непосредственно вызывает метод getCategories(com.kapaza.ContentSupplier supplier, com.kapaza.Category category), т.е. для начала я хочу хотя бы получить список имеющихся категорий этого сервиса.
Вот код:
| Код | import com.kapaza.*; import javax.xml.rpc.*;
public class ServiceKapaza { public static void main(String[] args) { ServiceKapaza kapaza = new ServiceKapaza();
ContentSupplier supplier = new ContentSupplier(); supplier.setUsername("login"); supplier.setPassword("password");
Category[] cats = kapaza.getCats(supplier, "nl", "be"); if (cats != null) { for (Category cat : cats) { System.out.println("Category: " + cat.getCategory()); } } }
public Category[] getCats(ContentSupplier supplier, String lang, String country) { Category cat = new Category(); cat.setCountryCode(country); cat.setLanguageCode(lang);
try { KapazaWebservice kapazaWebservice = new KapazaWebservice_Impl(); PortTypes servicePort = kapazaWebservice.getServicePort(); GetCategoriesRespond respond = servicePort.getCategories(supplier, cat); ResultMeta meta = respond.getResultMeta(); if (meta.getResult().equals("0")) { // "0" - Error "1" - Success System.err.println("Error found:\n" + meta.getErrormessage() + "\n\nError details: " + meta.getErrordetail()); System.exit(0); } else { return respond.getCategories(); } } catch(javax.xml.rpc.ServiceException ex) { java.util.logging.Logger.getLogger(KapazaWebservice.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch(java.rmi.RemoteException ex) { java.util.logging.Logger.getLogger(KapazaWebservice.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch(Exception ex) { java.util.logging.Logger.getLogger(KapazaWebservice.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } return null; } }
|
Можно было бы всё списать на сервис, но около года назад мне нужно было написать, для этого же сервиса, такого же клиента и нужно было это сделать на C#, что я собственно и сделал, тот клиент работает и по сей день (WSDL тот же). Теперь мне нужно сделать тоже самое, но на Java, да бы всё это работало под линуксом.
Вобщем я примерно по StackTrace понимаю в чём проблема, но не знаю, как её решить. Может кто сталкивался с подобным?
Заранее благодарен. |