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

7 Ağustos 2015 Cuma

Weblogic ayaga kalkarken alinan tuhaf hata

weblogic.application.ModuleException: com.sun.jersey.spi.inject.Errors$ErrorMessagesException: com.sun.jersey.spi.inject.Errors.ErrorMessagesException: null Bu hatanın sebebi server'ın System_Out.xxxx_nohup dosyasında görünüyor aslında. Aynı Path ve MediaType'ı birden fazla aynı metod kullanamıyor. Yani; @POST @Path("/some_path") @Consumes(MediaType.APPLICATION_JSON) @Produces({MediaType.APPLICATION_JSON}) public Response falanFilan (...){...} ile @POST @Path("/some_path") @Consumes(MediaType.APPLICATION_JSON) @Produces({MediaType.APPLICATION_JSON}) public Response yalanDolan (...){...} aynı anda kullanılamıyor. Biri kaldırıldığında sorun çözülecektir. com.sun.jersey.spi.inject.Errors processErrorMessages SEVERE: The following errors and warnings have been detected with resource and/or provider classes: SEVERE: Consuming media type conflict. The resource methods public javax.ws.rs.core.Response com.cenkc.test.web.DenemeService.create(javax.servlet.http.HttpServletRequest,java.lang.String,java.lang.String,java.lang.String) and public javax.ws.rs.core.Response com.cenkc.test.web.DenemeService.handleData(javax.servlet.http.HttpServletRequest,java.lang.String,java.lang.String,java.lang.String) can consume the same media type com.sun.jersey.spi.spring.container.servlet.SpringServlet initiate SEVERE: Exception occurred when intialization com.sun.jersey.spi.inject.Errors$ErrorMessagesException at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170) at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136) at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199) at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:795) at com.sun.jersey.spi.spring.container.servlet.SpringServlet.initiate(SpringServlet.java:117) at com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:321) at com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:605) at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:207) at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:376) at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:559) at javax.servlet.GenericServlet.init(GenericServlet.java:240) at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:337) at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:288) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120) at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57) at weblogic.servlet.internal.StubSecurityHelper.initServletInstance(StubSecurityHelper.java:98) at weblogic.servlet.internal.StubSecurityHelper.createServlet(StubSecurityHelper.java:86) at weblogic.servlet.internal.StubLifecycleHelper.createOneInstance(StubLifecycleHelper.java:71) at weblogic.servlet.internal.StubLifecycleHelper.(StubLifecycleHelper.java:57) at weblogic.servlet.internal.StubLifecycleHelper.(StubLifecycleHelper.java:31) at weblogic.servlet.internal.ServletStubImpl.initStubLifecycleHelper(ServletStubImpl.java:660) at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:600) at weblogic.servlet.internal.WebAppServletContext.preloadServlet(WebAppServletContext.java:1979) at weblogic.servlet.internal.WebAppServletContext.loadServletsOnStartup(WebAppServletContext.java:1956) at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1846) at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:2876) at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1661) at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:823) at weblogic.application.internal.ExtensibleModuleWrapper$StartStateChange.next(ExtensibleModuleWrapper.java:360) at weblogic.application.internal.ExtensibleModuleWrapper$StartStateChange.next(ExtensibleModuleWrapper.java:356) at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42) at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:138) at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124) at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:216) at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:211) at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42) at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:73) at weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:24) at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:729) at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42) at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:258) at weblogic.application.internal.SingleModuleDeployment.activate(SingleModuleDeployment.java:48) at weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:165) at weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:80) at weblogic.deploy.internal.targetserver.operations.AbstractOperation.activate(AbstractOperation.java:587) at weblogic.deploy.internal.targetserver.operations.ActivateOperation.activateDeployment(ActivateOperation.java:150) at weblogic.deploy.internal.targetserver.operations.ActivateOperation.doCommit(ActivateOperation.java:116) at weblogic.deploy.internal.targetserver.operations.StartOperation.doCommit(StartOperation.java:151) at weblogic.deploy.internal.targetserver.operations.AbstractOperation.commit(AbstractOperation.java:339) at weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentCommit(DeploymentManager.java:846) at weblogic.deploy.internal.targetserver.DeploymentManager.activateDeploymentList(DeploymentManager.java:1275) at weblogic.deploy.internal.targetserver.DeploymentManager.handleCommit(DeploymentManager.java:442) at weblogic.deploy.internal.targetserver.DeploymentServiceDispatcher.commit(DeploymentServiceDispatcher.java:176) at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.doCommitCallback(DeploymentReceiverCallbackDeliverer.java:195) at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.access$100(DeploymentReceiverCallbackDeliverer.java:13) at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer$2.run(DeploymentReceiverCallbackDeliverer.java:68) at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:548) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311) at weblogic.work.ExecuteThread.run(ExecuteThread.java:263)

12 Şubat 2015 Perşembe

ORA-28500 hatası

Oracle Database Gateway for Teradata kullanarak Oracle 11g veritabanından Teradata veritabanına bir bağlantı oluşturduktan sonra, 11g'de aşağıdaki tns kaydı ile bir dblink oluşturduk

connect_descriptor=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host_name)(PORT=port_number))(CONNECT_DATA=(SID=gateway_sid))(HS=OK))
CREATE PUBLIC DATABASE LINK "link_to_teradata"
 CONNECT TO user_name
 IDENTIFIED BY 
 USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host_name)(PORT=port_number))(CONNECT_DATA=(SID=gateway_sid))(HS=OK))';
select atarken "date_field" alanını filtrelediğimizde 

Select
"date_field", "field_1", "field_2" --.....
from "table_name"@link_to_teradata
Where "date_field" >= to_date('2015-01-01','yyyy-mm-dd')

aşağıdaki şekilde bir hata aldık. 

ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
[Teradata][ODBC Teradata Driver][Teradata Database] Invalid date supplied for SM_DATA_QUALITY.DATE_TIME.  {22008,NativeErr = -2666}
ORA-02063: preceding 2 lines from SLM_TO_TERADATA

Bir kaç workaround (with clause, to_date() vs.) denedik ama hiç birinde de sonuç alamadık.

Geriye iki yöntem kalıyordu :
1)  ODI gibi bir ETL tool'u kullanarak tabloyu olduğu gibi Oracle veritabanına almak daha sonra bu tabloyu sorgulamak
2)  Yukarıdaki sorguyu TERADATA tarafında bir view'a almak ve tarih alanını STRING'e convert etmek.

Görüleceği üzere 2. yöntem daha az zahmetli ve daha esnek.

Sonuç olarak view'da tarih alanını şu şekilde yapınca sorun da düzeldi : 

CAST(CAST(date_field AS DATE FORMAT 'YYYY-MM-DD') AS CHAR(11)) date_field

tabi sorgumuzu da aşağıdaki gibi güncelledikten sonra :)

Select
"date_field", "field_1", "field_2" --.....
from "table_name"@link_to_teradata
Where to_date("date_field",'yyyy-mm-dd') >= to_date('2015-01-01','yyyy-mm-dd')