Note that there are some explanatory texts on larger screens.

plurals
  1. POHow WSO2DSS manage the XML mapping of queries which contains some columns with null value
    primarykey
    data
    text
    <p>I have a simple query </p> <pre><code>select t.firstname, t.lastname, t.zipcode, t.city from name_data t where name_id = ? </code></pre> <p>The '?' is the input parameter and is never null. </p> <p>The query returns a record looking like one of these:</p> <p>Case 1 - Individual</p> <pre><code> 'First Name' 'Last Name' 'zipcode' 'city' ------------------------------------------------------- John Doe 1177 Somewhere </code></pre> <p>Case 2 - Company</p> <pre><code> 'First Name' 'Last Name' 'zipcode' 'city' ----------------------------------------------------------- &lt;&lt;null&gt;&gt; ACME Ltd 1199 'Somewhere else' </code></pre> <p>When I am getting the second record, The DSS throw a NullPointerException.</p> <p>I guess this is because the &lt;> value in Firstname and I found a way to bypass this by testing the null value in the SQL (Oracle)</p> <p>"select nvl(t.firstname, ' ') firstname, nvl(t.lastname, ' '), lastname, nvl(t.zipcode, ' '), nvl(t.city, ' ') etc..."</p> <p>And this for all columns which can be null (my query is a bit longer than this) as they are optionnal.</p> <p>I know this should not happens (in theory) if the database was correctly designed (like create two different entities for managing people and companies) but it is a commercial product and then I just cannot change it and I took a simple case to explain instead a long query.</p> <p>The extract of my .dbs is: </p> <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http:///org/wso2/carbonstudio/eclipse/ds" name="${groupId}.${artifactId}-customeraddress-1" serviceNamespace="urn:customeraddress.database.mycompany.org/1" serviceGroup="${groupId}" baseURI=""&gt; &lt;description&gt;This is the datasource to access the customer address information&lt;/description&gt; &lt;config id="ambocs"&gt; &lt;property name="org.wso2.ws.dataservice.driver"&gt;@ambocs.driver@&lt;/property&gt; &lt;property name="org.wso2.ws.dataservice.protocol"&gt;@ambocs.url@&lt;/property&gt; &lt;property name="org.wso2.ws.dataservice.user"&gt;@ambocs.user@&lt;/property&gt; &lt;property name="org.wso2.ws.dataservice.password"&gt;@ambocs.password@&lt;/property&gt; &lt;property name="org.wso2.ws.dataservice.minpoolsize"&gt;@ambocs.minpoolsize@&lt;/property&gt; &lt;property name="org.wso2.ws.dataservice.maxpoolsize"&gt;@ambocs.maxpoolsize@&lt;/property&gt; &lt;property name="org.wso2.ws.dataservice.validation_query"&gt;select 1 from dual&lt;/property&gt; &lt;/config&gt; &lt;query id="getCustomerAddressByIdRef" useConfig="ambocs" returnRowId="true"&gt; &lt;sql&gt; select nvl(nd.first_name, ' ') first_name, nvl(nd.last_name, ' ') last_name, nvl(nd.adr_zip, ' ') zipcode, nvl(nd.adr_city, ' ') city, nvl(nd.adr_country, ' ') country from name_data nd where nd.name_id = ? &lt;/sql&gt; &lt;properties&gt; &lt;property name="org.wso2.ws.dataservice.query_timeout"&gt;&lt;/property&gt; &lt;property name="org.wso2.ws.dataservice.fetch_direction"&gt;&lt;/property&gt; &lt;property name="org.wso2.ws.dataservice.fetch_size"&gt;&lt;/property&gt; &lt;property name="org.wso2.ws.dataservice.max_field_size"&gt;&lt;/property&gt; &lt;property name="org.wso2.ws.dataservice.max_rows"&gt;&lt;/property&gt; &lt;/properties&gt; &lt;result element="ContactDetails" rowName="ContactDetail" defaultNamespace="urn:customeraddress.database.mycompany.org/1" outputType="xml"&gt; &lt;attribute name="firstName" column="first_name" query-param="" requiredRoles="" xsdType="xs:string"/&gt; &lt;attribute name="lastName" column="last_business_name" query-param="" requiredRoles="" xsdType="xs:string"/&gt; &lt;attribute name="locality" column="city" query-param="" requiredRoles="" xsdType="xs:string"/&gt; &lt;attribute name="postcode" column="zipcode" query-param="" requiredRoles="" xsdType="xs:string"/&gt; &lt;attribute name="country" column="country" query-param="" requiredRoles="" xsdType="xs:string"/&gt; &lt;/result&gt; &lt;param name="nameId" type="IN" sqlType="STRING" defaultValue="" /&gt; &lt;/query&gt; &lt;operation name="getCustomerAddressById"&gt; &lt;call-query href="getCustomerAddressByIdRef"&gt; &lt;with-param name="nameId" column="nameId" query-param="nameId"/&gt; &lt;/call-query&gt; &lt;/operation&gt; &lt;/data&gt; </code></pre> <p>Do you know if there is an option to put in the .dbs in order to manage the null value returned by the query? </p> <p>I tried to find a documentation on the wso2.org but it is very simple examples and nothing about this case.</p> <p><strong>UPDATE</strong> Here the table schema:</p> <pre><code>CREATE TABLE "NAME_DATA" ( "NAME_ID" NUMBER(9,0) CONSTRAINT "PK_NAME_ID" NOT NULL ENABLE, "SYS_CREATION_DATE" DATE NOT NULL ENABLE, "SYS_UPDATE_DATE" DATE, "LAST_NAME" VARCHAR2(60), "FIRST_NAME" VARCHAR2(32), "ZIP_CODE" VARCHAR2(4), "CITY" VARCHAR2(255), "COUNTRY" CHAR(3 BYTE), CONSTRAINT "NAME_DATA_PK" PRIMARY KEY ("NAME_ID") ) CREATE UNIQUE INDEX "NAME_DATA_PK" ON "NAME_DATA" ("NAME_ID") CREATE INDEX "IDX_NAME_DATA_1" ON "NAME_DATA"("LAST_NAME","FIRST_NAME") CREATE INDEX "IDX_NAME_DATA_2" ON "NAME_DATA"(UPPER("FIRST_NAME")) CREATE INDEX "IDX_NAME_DATA_3" ON "NAME_DATA"(UPPER("LAST_NAME")) </code></pre> <p><strong>UPDATE 2</strong> - stacktrace: </p> <pre><code>TID: [0] [WSO2 Data Services Server] [2012-03-27 14:02:22,730] ERROR {org.apache.axis2.transport.http.AxisServlet} - {org.apache.axis2.transport.http.AxisServlet} java.lang.NullPointerException at com.ctc.wstx.sw.BaseNsStreamWriter.doWriteAttr(BaseNsStreamWriter.java:468) at com.ctc.wstx.sw.BaseNsStreamWriter.writeAttribute(BaseNsStreamWriter.java:230) at org.apache.axiom.util.stax.wrapper.XMLStreamWriterWrapper.writeAttribute(XMLStreamWriterWrapper.java:88) at org.apache.axiom.om.impl.MTOMXMLStreamWriter.writeAttribute(MTOMXMLStreamWriter.java:230) at org.wso2.carbon.dataservices.core.engine.DSWrappedXMLStreamWriter.writeXMLEvent(DSWrappedXMLStreamWriter.java:418) at org.wso2.carbon.dataservices.core.engine.DSWrappedXMLStreamWriter.writeOutInitialXMLEvents(DSWrappedXMLStreamWriter.java:508) at org.wso2.carbon.dataservices.core.engine.DSWrappedXMLStreamWriter.finalizeBuffering(DSWrappedXMLStreamWriter.java:501) at org.wso2.carbon.dataservices.core.engine.DSWrappedXMLStreamWriter.flush(DSWrappedXMLStreamWriter.java:145) at org.wso2.carbon.dataservices.core.engine.DSOMDataSource.execute(DSOMDataSource.java:102) at org.wso2.carbon.dataservices.core.engine.DSOMDataSource.serialize(DSOMDataSource.java:110) at org.apache.axiom.om.impl.llom.OMSourcedElementImpl.internalSerialize(OMSourcedElementImpl.java:691) at org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:563) at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875) at org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.serializeInternally(SOAPEnvelopeImpl.java:283) at org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.internalSerialize(SOAPEnvelopeImpl.java:245) at org.apache.axiom.om.impl.llom.OMSerializableImpl.serializeAndConsume(OMSerializableImpl.java:193) at org.apache.axis2.transport.http.SOAPMessageFormatter.writeTo(SOAPMessageFormatter.java:74) at org.apache.axis2.transport.http.CommonsHTTPTransportSender.sendUsingOutputStream(CommonsHTTPTransportSender.java:409) at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:286) at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:443) at org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver.invokeBusinessLogic(AbstractInOutSyncMessageReceiver.java:45) at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:110) at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:181) at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:172) at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:146) at org.wso2.carbon.core.transports.CarbonServlet.doPost(CarbonServlet.java:199) at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.eclipse.equinox.http.servlet.internal.ServletRegistration.handleRequest(ServletRegistration.java:90) at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:111) at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:67) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.wso2.carbon.bridge.BridgeServlet.service(BridgeServlet.java:164) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.wso2.carbon.server.CarbonStuckThreadDetectionValve.invoke(CarbonStuckThreadDetectionValve.java:154) at org.wso2.carbon.server.TomcatServer$1.invoke(TomcatServer.java:254) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399) at org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:396) at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:356) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1534) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) TID: [0] [WSO2 Data Services Server] [2012-03-27 14:02:22,730] ERROR {org.apache.axis2.transport.http.AxisServlet} - {org.apache.axis2.transport.http.AxisServlet} java.lang.NullPointerException at com.ctc.wstx.sw.BaseNsStreamWriter.doWriteAttr(BaseNsStreamWriter.java:468) at com.ctc.wstx.sw.BaseNsStreamWriter.writeAttribute(BaseNsStreamWriter.java:230) at org.apache.axiom.util.stax.wrapper.XMLStreamWriterWrapper.writeAttribute(XMLStreamWriterWrapper.java:88) at org.apache.axiom.om.impl.MTOMXMLStreamWriter.writeAttribute(MTOMXMLStreamWriter.java:230) at org.wso2.carbon.dataservices.core.engine.DSWrappedXMLStreamWriter.writeXMLEvent(DSWrappedXMLStreamWriter.java:418) at org.wso2.carbon.dataservices.core.engine.DSWrappedXMLStreamWriter.writeOutInitialXMLEvents(DSWrappedXMLStreamWriter.java:508) at org.wso2.carbon.dataservices.core.engine.DSWrappedXMLStreamWriter.finalizeBuffering(DSWrappedXMLStreamWriter.java:501) at org.wso2.carbon.dataservices.core.engine.DSWrappedXMLStreamWriter.flush(DSWrappedXMLStreamWriter.java:145) at org.wso2.carbon.dataservices.core.engine.DSOMDataSource.execute(DSOMDataSource.java:102) at org.wso2.carbon.dataservices.core.engine.DSOMDataSource.serialize(DSOMDataSource.java:110) at org.apache.axiom.om.impl.llom.OMSourcedElementImpl.internalSerialize(OMSourcedElementImpl.java:691) at org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:563) at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875) at org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.serializeInternally(SOAPEnvelopeImpl.java:283) at org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.internalSerialize(SOAPEnvelopeImpl.java:245) at org.apache.axiom.om.impl.llom.OMSerializableImpl.serializeAndConsume(OMSerializableImpl.java:193) at org.apache.axis2.transport.http.SOAPMessageFormatter.writeTo(SOAPMessageFormatter.java:74) at org.apache.axis2.transport.http.CommonsHTTPTransportSender.sendUsingOutputStream(CommonsHTTPTransportSender.java:409) at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:286) at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:443) at org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver.invokeBusinessLogic(AbstractInOutSyncMessageReceiver.java:45) at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:110) at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:181) at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:172) at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:146) at org.wso2.carbon.core.transports.CarbonServlet.doPost(CarbonServlet.java:199) at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.eclipse.equinox.http.servlet.internal.ServletRegistration.handleRequest(ServletRegistration.java:90) at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:111) at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:67) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.wso2.carbon.bridge.BridgeServlet.service(BridgeServlet.java:164) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.wso2.carbon.server.CarbonStuckThreadDetectionValve.invoke(CarbonStuckThreadDetectionValve.java:154) at org.wso2.carbon.server.TomcatServer$1.invoke(TomcatServer.java:254) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399) at org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:396) at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:356) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1534) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) </code></pre> <p>For testing this, you have to remove all "nvl(...)" in the DBS otherwise it is working well. It was a record where the first_name was "null". </p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload