Search code examples
odatasapui5olingo

Creating a new complex entry on OData [sapui]


I have this complex OData model:

<EntityType Name="ApprovalsRequest">
<Key>
<PropertyRef Name="IdUser"/>
<PropertyRef Name="RequestId"/>
</Key>
<Property Name="ApprovalTime" Type="Edm.DateTime" Nullable="true"/>
<Property Name="IdUser" Type="Edm.Int32" Nullable="false"/>
<Property Name="RequestId" Type="Edm.Int32" Nullable="false"/>
<Property Name="Request" Type="Edm.Int32" Nullable="true"/>
<Property Name="Status" Type="Edm.String"/>
<Property Name="User" Type="Edm.Int32" Nullable="true"/>
<NavigationProperty Name="RequestDetails" Relationship="rva-persistence.ApprovalsRequest_Request_Many_ZeroToOne0" FromRole="ApprovalsRequest" ToRole="Request"/>
<NavigationProperty Name="UserDetails" Relationship="rva-persistence.ApprovalsRequest_User_Many_ZeroToOne0" FromRole="ApprovalsRequest" ToRole="User"/>
</EntityType>

This model have two relationships with another models.

I'm trying to create a new entry of this model.

I have the following XML request:

<?xml version="1.0" encoding="UTF-8"?>
<a:entry xmlns:a="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
   <a:author>
      <a:name />
   </a:author>
   <a:content type="application/xml">
      <m:properties>
         <d:IdUser>1</d:IdUser>
         <d:RequestId>1</d:RequestId>
         <d:Request>1</d:Request>
         <d:User>1</d:User>
         <d:ApprovalTime>19/5/2017 9:58:00</d:ApprovalTime>
         <d:Status>1</d:Status>
      </m:properties>
   </a:content>
   <a:link href="http://localhost:8080/rva_backend_ui5/incloud_backend.svc/Users(1)" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/UsersDetails" type="application/atom+xml;type=entry" />
   <a:link href="http://localhost:8080/rva_backend_ui5/incloud_backend.svc/Requests(1)" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/RequestDetails" type="application/atom+xml;type=entry" />
</a:entry>

When I try to send this request I get an erro message:

The request body is malformed

What's wrong with my XML request?

thanks!

UPDATE 1

I've changed values of ApprovalTime attribute:

<d:ApprovalTime>2015-07-14T05:00:00</d:ApprovalTime>

But, I get another errors (I'm usin Apache Olingo for mapping JPA entities as OData objects):

Internal Exception: org.postgresql.util.PSQLException: ERROR: la columna «id_user» es de tipo integer pero la expresión es de tipo character varying
  Hint: Necesitará reescribir la expresión o aplicarle una conversió
Query: InsertObjectQuery(com.incloud.hcp.entity.ApprovalsRequest@243f0e32)

This is log:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: la columna «id_user» es de tipo integer pero la expresión es de tipo character varying
  Hint: Necesitará reescribir la expresión o aplicarle una conversión de tipo.
  Position: 96
Error Code: 0
Call: INSERT INTO approvals_request (approval_time, STATUS, request_id, id_user) VALUES (?, ?, ?, ?)
    bind => [2015-07-14 00:00:00.0, 1, 1, null]
Query: InsertObjectQuery(com.incloud.hcp.entity.ApprovalsRequest@243f0e32)
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:340)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.processExceptionForCommError(DatabaseAccessor.java:1611)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:898)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:962)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:631)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:558)
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1991)
    at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:298)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:242)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:377)
    at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:165)
    at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:180)
    at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:489)
    at org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:80)
    at org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:90)
    at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:301)
    at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899)
    at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:798)
    at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108)
    at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1793)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1775)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1726)
    at org.eclipse.persistence.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:226)
    at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:125)
    at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:4196)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1441)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1531)
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:277)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1169)
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:132)
    at org.apache.olingo.odata2.jpa.processor.core.ODataJPATransactionLocalDefault.commit(ODataJPATransactionLocalDefault.java:43)
    at org.apache.olingo.odata2.jpa.processor.core.access.data.JPAProcessorImpl.processCreate(JPAProcessorImpl.java:341)
    at org.apache.olingo.odata2.jpa.processor.core.access.data.JPAProcessorImpl.process(JPAProcessorImpl.java:223)
    at org.apache.olingo.odata2.jpa.processor.api.ODataJPADefaultProcessor.createEntity(ODataJPADefaultProcessor.java:115)
    at org.apache.olingo.odata2.core.Dispatcher.dispatch(Dispatcher.java:79)
    at org.apache.olingo.odata2.core.ODataRequestHandler.handle(ODataRequestHandler.java:131)
    at org.apache.olingo.odata2.core.rest.ODataSubLocator.handle(ODataSubLocator.java:164)
    at org.apache.olingo.odata2.core.rest.ODataSubLocator.handlePost(ODataSubLocator.java:86)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:180)
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:198)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:261)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:100)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:94)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
    at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:223)
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:203)
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137)
    at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:243)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:163)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:219)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at com.incloud.hcp.service.factory.CORSFilter.doFilter(CORSFilter.java:33)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)
    at com.sap.cloud.runtime.impl.bridge.security.AbstractAuthenticator.invoke(AbstractAuthenticator.java:210)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at com.sap.core.tenant.valve.TenantValidationValve.invokeNextValve(TenantValidationValve.java:168)
    at com.sap.core.tenant.valve.TenantValidationValve.invoke(TenantValidationValve.java:94)
    at com.sap.js.statistics.tomcat.valve.RequestTracingValve.invoke(RequestTracingValve.java:37)
    at com.sap.core.js.monitoring.tomcat.valve.RequestTracingValve.invoke(RequestTracingValve.java:27)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1502)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1458)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.postgresql.util.PSQLException: ERROR: la columna «id_user» es de tipo integer pero la expresión es de tipo character varying
  Hint: Necesitará reescribir la expresión o aplicarle una conversión de tipo.
  Position: 96
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:890)
    ... 90 more

UPDATE 2

I've solved my problem. My XML request was wrong, This is correted request:

<?xml version="1.0" encoding="UTF-8"?>
<a:entry xmlns:a="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
   <a:author>
      <a:name />
   </a:author>
   <a:content type="application/xml">
      <m:properties>
         <d:IdUser>1</d:IdUser>
         <d:RequestId>1</d:RequestId>
         <d:Request>1</d:Request>
         <d:User>2</d:User>
         <d:ApprovalTime>2015-07-14T05:00:00</d:ApprovalTime>
         <d:Status>1</d:Status>
      </m:properties>
   </a:content>
   <a:link href="http://localhost:8080/rva_backend_ui5/incloud_backend.svc/Requests(1)" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/RequestDetails" type="application/atom+xml;type=entry" />
   <a:link href="http://localhost:8080/rva_backend_ui5/incloud_backend.svc/Users(1)" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/UserDetails" type="application/atom+xml;type=entry" />
</a:entry>

One of link' url was wrong:

Incorrect version:

<a:link href="http://localhost:8080/rva_backend_ui5/incloud_backend.svc/Users(1)" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/UsersDetails" type="application/atom+xml;type=entry" />

Correct version (UserDetails instead of UsersDetails):

<a:link href="http://localhost:8080/rva_backend_ui5/incloud_backend.svc/Users(1)" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/UserDetails" type="application/atom+xml;type=entry" />

Solution

  • One thing that stands out is the datetime format you are using. The right format is described in the documentation here.

    'yyyy-mm-ddThh:mm[:ss[.fffffff]]' NOTE: Spaces are not allowed between datetime and quoted portion. datetime is case-insensitive

    (the datetime portion is left out as stated in the atom format)