26 Kasım 2015 Perşembe

wsimport ile client generate işleminde alınan hata

wsimport tool'u (ver : jaxws-ri-2.2.10) ile bir wsdl üzerinden ilgili web servisine erişebilmek için gerekli dosyaları generate etmek için komut satırından

C:\path\to\jaxws-ri-2.2.10\jaxws-ri\bin>wsimport -keep -verbose http://some_service_url:1111/service_name?WSDL -p com.cenkc.ws.service_name -d \path\to\files_to_be_generated

komutunu çalıştırdığımda aşağıdaki gibi bir hata aldım :

"[ERROR] Schema descriptor {http://some_url/service_name/schemas}SomeElementName in message part "request" is not defined and could not be bound to Java. Perhaps the schema descriptor {http://some_url/service_name/schemas}SomeElementName is not defined in the schema imported/included in the WSDL. You
 can either add such imports/includes or run wsimport and provide the schema location using -b switch.
  line 5 of http://some_service_url:1111/service_name?WSDL

Exception in thread "main" com.sun.tools.ws.wscompile.AbortException
        at com.sun.tools.ws.processor.modeler.wsdl.WSDLModelerBase.error(WSDLModelerBase.java:747)
        at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.getJAXBType(WSDLModeler.java:1662)
        at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.getDoclitParameters(WSDLModeler.java:1688)
        at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.processLiteralSOAPOperation(WSDLModeler.java:790)
        at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.processSOAPOperation(WSDLModeler.java:713)
        at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.processPort(WSDLModeler.java:481)
        at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.processService(WSDLModeler.java:259)
        at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.internalBuildModel(WSDLModeler.java:231)
        at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.buildModel(WSDLModeler.java:141)
        at com.sun.tools.ws.wscompile.WsimportTool.buildWsdlModel(WsimportTool.java:444)
        at com.sun.tools.ws.wscompile.WsimportTool.run(WsimportTool.java:205)
        at com.sun.tools.ws.wscompile.WsimportTool.run(WsimportTool.java:183)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.sun.tools.ws.Invoker.invoke(Invoker.java:174)
        at com.sun.tools.ws.WsImport.main(WsImport.java:57)"

İlk önce hata mesajında belirtilen schema descriptor linkini (http://some_url/service_name/schemas) açmayı denedim ve başarısız oldum.

Ardından, http://some_service_url:1111/service_name?WSDL linkini açtığımda, hata açıklamasında yazan "request" kısmını arattım, aşağıdaki bölüm geldi :


Buradaki element bilgisi olan "nsx1:..." in wsdl'daki karşılığı xmlns:nsx1="http://some_url/service_name/schemas" şeklinde. Ama wsimport tool'u bu url'e erişemediği için hata alıyor olduğum konusu netleşti.

Hatayı araştırırken wsimport komutunun "-b" parametresi ile başka bir schema tanımlanarak çalıştırılabileceğini gördüm. Örnekte bu bir xsd dosyası (XML Schema Definition) idi. 

C:\path\to\jaxws-ri-2.2.10\jaxws-ri\bin>wsimport –help

Usage: wsimport [options]

where [options] include:
  -b                  specify jaxws/jaxb binding files or additional schemas
                            (Each must have its own -b)


wsimport tool'unu, WSDL içindeki ilgili xsd'nin location bilgisini () kullanacak şekilde aşağıdaki gibi düzenlediğimde sorun düzeldi : 

wsimport -keep -verbose http://some_service_url:1111/service_name?WSDL -p com.cenkc.ws.service_name -d \path\to\files_to_be_generated -b http://some_service_url:1111/service_name?WSDL/service_name.xsd