SAP-archive / cloud-s4-sdk-examples

Runnable example applications that showcase the usage of the SAP Cloud SDK.
Apache License 2.0
66 stars 35 forks source link

"Failed to convert response into ODataFeed: An exception of type 'EdmSimpleTypeException' occurred." #81

Closed ghost closed 4 years ago

ghost commented 4 years ago

Hi team,

I'm trying to build an app that reads info from SFSF following these steps:

import com.google.gson.Gson; import org.slf4j.Logger; import org.slf4j.LoggerFactory;

import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List;

import com.sap.cloud.sdk.cloudplatform.connectivity.DestinationAccessor; import com.sap.cloud.sdk.odatav2.connectivity.ODataException;

import com.sap.cloud.sdk.s4hana.connectivity.DefaultErpHttpDestination; import com.sap.cloud.sdk.s4hana.connectivity.ErpHttpDestination; import com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.rcmjobrequisition.JobRequisition; import com.sap.cloud.sdk.s4hana.datamodel.odata.services.DefaultRCMJobRequisitionService;

@WebServlet("/req") public class JobReqServlet extends HttpServlet {

private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(JobReqServlet.class);

private final ErpHttpDestination destination = DestinationAccessor.getDestination("sfsf-sdk-dest").asHttp()
        .decorate(DefaultErpHttpDestination::new);

@Override
protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
        throws ServletException, IOException {
    try {
        final List<JobRequisition> jobReqs = new DefaultRCMJobRequisitionService()
            .getAllJobRequisition()
            .execute(destination);
        response.setContentType("application/json");
        response.getWriter().write(new Gson().toJson(jobReqs));
    } catch (final ODataException e) {
        logger.error(e.getMessage(), e);
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        response.getWriter().write(e.getMessage());
    }
}

}


With all this (I think I'm not missing anything), I do:

mvn clean install

and:

cf push

Everything works well, the hello world servlet works, but when I try to access /req, I get a:
Unable to execute metadata request.

However, I can see that the app is hitting SFSF because if I play with the base path of the service (in the pom.xml) I get 404's coming from SFSF.

Checking everything, I see this when the VDM generator is running:
1. This is the base path I'm giving in the pom:
/odata/v2
2. I can see the generator picking that path correctly:

[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.DataModelGenerator - Default base path: /odata/v2/

3. But this is what the generator processes:

[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.ODataToVdmGenerator - Title: RCMJobRequisition [main] INFO com.sap.cloud.sdk.datamodel.odata.generator.ODataToVdmGenerator - Raw URL: /odata/v2/SFODataSet [main] INFO com.sap.cloud.sdk.datamodel.odata.generator.ODataToVdmGenerator - Java Package Name: rcmjobrequisition [main] INFO com.sap.cloud.sdk.datamodel.odata.generator.ODataToVdmGenerator - Java Class Name: RCMJobRequisition

Clearly, that *SFODataSet* in the URL is not correct. When the app runs, it's tring to get the metadata from .../odata/v2/SFODataSet/$metadata, and that's why it's not finding it.
That SFODataSet is coming from the SFSF metadata:
Job Requisition Template These entities represent the job requisition template as defined in provisioning. Recruiting (RCM) RCM - Job Requisition ... ``` I tried something else. In the java class, I added ``` .withServicePath("odata/v2") ``` in the call to the destination, leaving it like this:: ``` final List jobReqs = new DefaultRCMJobRequisitionService() .withServicePath("odata/v2/JobRequisition") .getAllJobRequisition() .execute(destination); ``` That replaces the /odata/v2/SFODataSet url that was generated. In this case, the error I get is: ``` "com.sap.cloud.sdk.odatav2.connectivity.ODataQuery","thread":"http-nio-0.0.0.0-8080-exec-3","level":"ERROR","categories":[],"msg":"Failed to convert response into ODataFeed: An exception of type 'EdmSimpleTypeException' occurred." } ``` I've tried different values: odata/v2, odata/v2/, odata/v2/JobRequisition... I can't find the way for this to work. Can you help me find the issue here? I'm using: - Apache Maven 3.6.2 - SAP Cloud SDK 3.13.0 Kr, kepair
MatKuhr commented 4 years ago

Sorry, we somehow missed this one. I replied to your question on stack overflow. Thus I'll close this issue here to not have a duplicate open.