未知异常" null-解析元数据时出错。"执行DefaultSalesOrderService()时 - updateSalesOrder()

时间:2018-04-16 17:15:29

标签: odata metadata sap s4sdk

作为PoC的一部分,我目前正在尝试为S / 4HANA Cloud的并行扩展构建原型,包括两个层:使用 S与Java后端分离的SAPUI5前端/ 4HANA Cloud SDK。

总的来说,它的效果也很好。但是我经常遇到UPDATE命令的问题,所以我为了演示目的编写了一个小的servlet。现在我总是在更新期间得到相同的异常,即解析元数据时"错误"

我已经尝试过所有内容,但现在不知道这个异常的触发器是什么。

我试图在pom.xml中添加更多依赖项,但这没有成功。尝试使用GET命令获取所有字段并更新填充的对象也是不成功的。 ETag也不是问题,这是自#34; versionIdentifier"的最新版本开始处理的。优异。

如果你们其中一个人知道我的错误在哪里,我将非常感激!

提前感谢您的帮助!

[OLD]代码片段:公共类UpdateService扩展了HttpServlet

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    // Test-Run: UPDATE
    response.getWriter().write("Test-Run: UPDATE" + "\n");

    // Prepare the S/4HANA Cloud Service
    DefaultSalesOrderService service = new DefaultSalesOrderService();

    // Prepare the required Variables
    String salesOrderKey = "1";
    String deliveryBlockReason = "01";
    SalesOrder salesOrder;

    try {

        // Get the Sales Order
        response.getWriter().write("Step 1: Get old data.." + "\n");
        salesOrder = service.getSalesOrderByKey(salesOrderKey).select(SalesOrder.DELIVERY_BLOCK_REASON).execute();

        // Output: OLD DATA
        response.getWriter().write(new Gson().toJson(salesOrder) + "\n");

        // Change the Data
        response.getWriter().write("\n" + "Step 2: Set new data.." + "\n");
        salesOrder.setDeliveryBlockReason(deliveryBlockReason);

        // Output: NEW DATA
        response.getWriter().write(new Gson().toJson(salesOrder) + "\n");

        // Save the Changes
        response.getWriter().write("\n" + "Step 3: Save new data.." + "\n");
        service.updateSalesOrder(salesOrder).execute();

        // Success Message
        response.getWriter().write("\n" + "Update successful!");

    } catch (final ODataException e) {
        // Handle Errors
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        response.getWriter().write("\n" + "Update failed!" + "\n");
        response.getWriter().write("Error Code: " + e.getCode() + "\n");
        response.getWriter().write("Message: " + e.getMessage() + "\n");
    }
}

[OLD] Http-Response

Test-Run: UPDATE

Step 1: Get old data..
{"DeliveryBlockReason":"","versionIdentifier":"W/\"datetimeoffset\u00272017-06-19T08%3A31%3A55.6635100Z\u0027\""}

Step 2: Set new data..
{"DeliveryBlockReason":"01","versionIdentifier":"W/\"datetimeoffset\u00272017-06-19T08%3A31%3A55.6635100Z\u0027\""}

Step 3: Save new data..

Update failed!
Error Code: null
Message: Error while parsing the metadata.

更新 - 2018-04-18

首先,感谢您的帮助!

我重新编写了代码并实施了Henning的解决方法。乍一看,一切似乎都有效。没有例外也没有警告。

但是,在后端你可以看到,实际值保持不变。你能给我另一个建议吗?

[新]代码片段:公共类UpdateService扩展了HttpServlet

    @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    // Test-Run: UPDATE
    response.getWriter().write("Test-Run: UPDATE" + "\n");

    // Prepare the S/4HANA Cloud Service
    DefaultSalesOrderService service = new DefaultSalesOrderService();

    // Prepare the Sales Order Object
    SalesOrder salesOrder = null;

    // Prepare the required Variables
    String salesOrderKey = "163";

    // GET
    try {
        salesOrder = service.getSalesOrderByKey(salesOrderKey).select(SalesOrder.ALL_FIELDS).execute();

        // Success Message
        response.getWriter().write("\n" + "GET successful!:" + "\n");

        // Output: OLD DATA
        response.getWriter().write("Old Data:" + "\n");
        response.getWriter().write(new Gson().toJson(salesOrder) + "\n");

    } catch (ODataException e) {
        // Handle Errors
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        response.getWriter().write("\n" + "GET failed!" + "\n");
        response.getWriter().write("| Error Code: " + e.getCode() + "\n");
        response.getWriter().write("| Message: " + e.getMessage() + "\n");
    }

    // CHANGE
    salesOrder.setSalesOrderType("SO");

    // Success Message
    response.getWriter().write("\n" + "CHANGE successful!:" + "\n");

    // Output: NEW DATA
    response.getWriter().write("New Data:" + "\n");
    response.getWriter().write(new Gson().toJson(salesOrder) + "\n");

    // UPDATE
    try {

        // Workaround - Henning Heitkötter -
        // https://stackoverflow.com/questions/49862888/unknown-exception-null-error-while-parsing-the-metadata-while-executing-defa

        SalesOrderUpdateFluentHelper updateHelper = new SalesOrderUpdateFluentHelper(salesOrder) {
            @Override
            public ODataUpdateRequest toQuery() {
                ODataUpdateRequestBuilder requestBuilder = getQueryBuilder()
                        .withErrorHandler(new ODataVdmErrorResultHandler());
                getEntity().setSalesOrder(null);
                final Map<String, Object> params = new ODataJsonMapResolver(getEntity()).withoutNullValues();
                return requestBuilder.withBodyAsMap(params).build();
            }
        };

        // EXECUTE
        updateHelper.execute();

        // Success Message
        response.getWriter().write("\n" + "UPDATE successful!" + "\n");

    } catch (ODataException e) {
        // Handle Errors
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        response.getWriter().write("\n" + "UPDATE failed!" + "\n");
        response.getWriter().write("| Error Code: " + e.getCode() + "\n");
        response.getWriter().write("| Message: " + e.getMessage() + "\n");
    }

}

[新] Http-Response

    Test-Run: UPDATE

GET successful!:
Old Data:
{"SalesOrder":"163","SalesOrderType":"OR","SalesOrganization":"1010","DistributionChannel":"10","OrganizationDivision":"00","SalesGroup":"","SalesOffice":"","SalesDistrict":"","SoldToParty":"1000355","CreationDate":1516752000000,"CreatedByUser":"CB9980000321","LastChangeDateTime":1516793069586,"PurchaseOrderByCustomer":"110","CustomerPurchaseOrderType":"","CustomerPurchaseOrderDate":1516752000000,"SalesOrderDate":1516752000000,"TotalNetAmount":35.00,"TransactionCurrency":"EUR","SDDocumentReason":"","PricingDate":1516752000000,"RequestedDeliveryDate":1516752000000,"ShippingCondition":"","CompleteDeliveryIsDefined":false,"ShippingType":"","HeaderBillingBlockReason":"","DeliveryBlockReason":"","IncotermsClassification":"CFR","IncotermsTransferLocation":"DE","IncotermsLocation1":"DE","IncotermsLocation2":"","IncotermsVersion":"","CustomerPaymentTerms":"0001","PaymentMethod":"","OverallSDProcessStatus":"A","TotalCreditCheckStatus":"","OverallTotalDeliveryStatus":"","OverallSDDocumentRejectionSts":"A","versionIdentifier":"W/\"datetimeoffset\u00272018-01-24T11%3A24%3A29.5861550Z\u0027\"","AssignmentReference":""}

CHANGE successful!:
New Data:
{"SalesOrder":"163","SalesOrderType":"SO","SalesOrganization":"1010","DistributionChannel":"10","OrganizationDivision":"00","SalesGroup":"","SalesOffice":"","SalesDistrict":"","SoldToParty":"1000355","CreationDate":1516752000000,"CreatedByUser":"CB9980000321","LastChangeDateTime":1516793069586,"PurchaseOrderByCustomer":"110","CustomerPurchaseOrderType":"","CustomerPurchaseOrderDate":1516752000000,"SalesOrderDate":1516752000000,"TotalNetAmount":35.00,"TransactionCurrency":"EUR","SDDocumentReason":"","PricingDate":1516752000000,"RequestedDeliveryDate":1516752000000,"ShippingCondition":"","CompleteDeliveryIsDefined":false,"ShippingType":"","HeaderBillingBlockReason":"","DeliveryBlockReason":"","IncotermsClassification":"CFR","IncotermsTransferLocation":"DE","IncotermsLocation1":"DE","IncotermsLocation2":"","IncotermsVersion":"","CustomerPaymentTerms":"0001","PaymentMethod":"","OverallSDProcessStatus":"A","TotalCreditCheckStatus":"","OverallTotalDeliveryStatus":"","OverallSDDocumentRejectionSts":"A","versionIdentifier":"W/\"datetimeoffset\u00272018-01-24T11%3A24%3A29.5861550Z\u0027\"","AssignmentReference":""}

UPDATE successful!

[新] S / 4HANA Cloud API

    <entry m:etag="W/"datetimeoffset'2018-01-24T11%3A24%3A29.5861550Z'"">
    <id>
   ...../sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder('163')
    </id>
    <title type="text">A_SalesOrder('163')</title>
    <updated>2018-04-18T16:03:24Z</updated>
    <category term="API_SALES_ORDER_SRV.A_SalesOrderType" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
    <link href="A_SalesOrder('163')" rel="edit" title="A_SalesOrderType"/>
    <link href="A_SalesOrder('163')/to_Item" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/to_Item" type="application/atom+xml;type=feed" title="to_Item"/>
    <link href="A_SalesOrder('163')/to_Partner" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/to_Partner" type="application/atom+xml;type=feed" title="to_Partner"/>
    <link href="A_SalesOrder('163')/to_PricingElement" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/to_PricingElement" type="application/atom+xml;type=feed" title="to_PricingElement"/>
    <content type="application/xml">
    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
    <d:SalesOrder>163</d:SalesOrder>
    <d:SalesOrderType>OR</d:SalesOrderType>
    <d:SalesOrganization>1010</d:SalesOrganization>
    <d:DistributionChannel>10</d:DistributionChannel>
    <d:OrganizationDivision>00</d:OrganizationDivision>
    <d:SalesGroup/>
    <d:SalesOffice/>
    <d:SalesDistrict/>
    <d:SoldToParty>1000355</d:SoldToParty>
    <d:CreationDate>2018-01-24T00:00:00</d:CreationDate>
    <d:CreatedByUser>CB9980000321</d:CreatedByUser>
    <d:LastChangeDate m:null="true"/>
    <d:LastChangeDateTime>2018-01-24T11:24:29.5861550Z</d:LastChangeDateTime>
    <d:PurchaseOrderByCustomer>110</d:PurchaseOrderByCustomer>
    <d:CustomerPurchaseOrderType/>
    <d:CustomerPurchaseOrderDate>2018-01-24T00:00:00</d:CustomerPurchaseOrderDate>
    <d:SalesOrderDate>2018-01-24T00:00:00</d:SalesOrderDate>
    <d:TotalNetAmount>35.00</d:TotalNetAmount>
    <d:TransactionCurrency>EUR</d:TransactionCurrency>
    <d:SDDocumentReason/>
    <d:PricingDate>2018-01-24T00:00:00</d:PricingDate>
    <d:RequestedDeliveryDate>2018-01-24T00:00:00</d:RequestedDeliveryDate>
    <d:ShippingCondition/>
    <d:CompleteDeliveryIsDefined>false</d:CompleteDeliveryIsDefined>
    <d:ShippingType/>
    <d:HeaderBillingBlockReason/>
    <d:DeliveryBlockReason/>
    <d:IncotermsClassification>CFR</d:IncotermsClassification>
    <d:IncotermsTransferLocation>DE</d:IncotermsTransferLocation>
    <d:IncotermsLocation1>DE</d:IncotermsLocation1>
    <d:IncotermsLocation2/>
    <d:IncotermsVersion/>
    <d:CustomerPaymentTerms>0001</d:CustomerPaymentTerms>
    <d:PaymentMethod/>
    <d:AssignmentReference/>
    <d:OverallSDProcessStatus>A</d:OverallSDProcessStatus>
    <d:TotalCreditCheckStatus/>
    <d:OverallTotalDeliveryStatus/>
    <d:OverallSDDocumentRejectionSts>A</d:OverallSDDocumentRejectionSts>
    </m:properties>
    </content>
    </entry>

3 个答案:

答案 0 :(得分:7)

解析元数据时发生错误,因为未在您的实体上设置关键字段SalesOrder。您需要将其作为按键获取的一部分进行检索,如下所示,然后您可以更改允许SAP S / 4HANA更改的字段,例如请求的交付日期:

SalesOrder salesOrder = service.getSalesOrderByKey(salesOrderKey)
    .select(SalesOrder.SALES_ORDER)
    .execute()
salesOrder.setRequestedDeliveryDate(Calendar.getInstance());
service.updateSalesOrder(salesOrder).execute();

从SAP S / 4HANA Cloud SDK的version 1.11.1开始,这将只发送更改的字段(或您通过includesFields明确指定的任何字段)。

注意:无法通过API更改某些字段,如SalesOrderType或DeliveryBlockReason。

确保使用最新版本的SAP S / 4HANA Cloud SDK,至少版本为1.11.1。

答案 1 :(得分:1)

您使用的是哪个版本的S / 4HANA Cloud SDK? 如果您未使用1.10.0,请升级到此版本(目前是最新版本)并重试。

答案 2 :(得分:0)

我假设您正在连接到当前的SAP S / 4HANA版本,我是对的吗?

请重现错误并打开transaction / n / iwfnd / error_log。 查找相应的错误消息,并在此处提供相应的响应标题和正文。

确保省略任何机密信息。