Использование OData V4 из SAPUI5 - PullRequest
1 голос
/ 07 июля 2019

Я пытаюсь использовать OData V4 с SAPUI5. Хотя это кажется довольно прямым, я сталкиваюсь с парой проблем.

Я использую образец sap.ui.layout.sample.SimpleFormToolbar из Demokit. Реализован сервис OData V4 для отображения данных в простой форме.

Изменения, которые я сделал в этом приложении:
1. manifest.json и
2. Page.view.xml для привязки контекста элемента управления формы
3. Удален код ссылки на макет данных в контроллере и index.html

Однако я не могу получить данные со следующими ошибками:

2019-07-07 08:58:23.736110 Failed to update path /Suppliers(12345)/Country - **Error: Must not change a property before it has been read**

**Uncaught Error: Must not change a property before it has been read**

Другая ошибка связана с пакетным режимом. Я не реализовал пакетную обработку в Odata impl.

2019-07-07 08:58:24.279114 **$batch failed** - Error: Network error
2019-07-07 08:58:24.281175 Failed to read path /Suppliers(12345) - Error: **HTTP request was not processed because $batch failed**

Код, который я использую:

// manifest.json

{
    "_version": "1.12.0",
    "sap.app": {
        "id": "sap.ui.layout.sample.SimpleFormToolbar",
        "applicationVersion": {
            "version": "1.0.0"
        },
        "dataSources": {
          "supplierOData": {
            "uri": "https://supplierappp1014576trial.hanatrial.ondemand.com/SupplierApp/SupplierService.svc/",
            "type": "OData",
            "settings": {
              "odataVersion": "4.0"
            }
          }
        }
    },
    "sap.ui5": {
        "rootView": {
            "viewName": "sap.ui.layout.sample.SimpleFormToolbar.Page",
            "type": "XML",
            "async": true
        },
        "dependencies": {
            "libs": {
                "sap.ui.layout": {}
            }
        },
        "models": {
            "": {
                "dataSource": "supplierOData",
                "settings" : {
                    "synchronizationMode" : "None"
                }
            }
        },
        "config": {
            "sample": {
                "files": [
                    "Page.view.xml",
                    "Page.controller.js",
                    "manifest.json"
                ]
            }
        }
    }
}

// Page.view.xml

<mvc:View
    controllerName="sap.ui.layout.sample.SimpleFormToolbar.Page"
    xmlns:l="sap.ui.layout"
    xmlns:f="sap.ui.layout.form"
    xmlns:mvc="sap.ui.core.mvc"
    xmlns:core="sap.ui.core"
    xmlns="sap.m">
    <VBox class="sapUiSmallMargin">
        <f:SimpleForm id="SimpleFormToolbar"
            binding="{/Suppliers(12345)}"
            editable="true"
            layout="ResponsiveGridLayout"
            labelSpanXL="4"
            labelSpanL="3"
            labelSpanM="4"
            labelSpanS="12"
            adjustLabelSpan="false"
            emptySpanXL="0"
            emptySpanL="4"
            emptySpanM="0"
            emptySpanS="0"
            columnsXL="2"
            columnsL="1"
            columnsM="1"
            singleContainerFullSize="false"
            ariaLabelledBy="Title1" >
            <f:toolbar>
                <Toolbar id="TB1">
                    <Title id="Title1" text="Address" level="H4" titleStyle="H4"/>
                    <ToolbarSpacer />
                    <Button icon="sap-icon://settings"/>
                    <Button icon="sap-icon://drop-down-list" />
                </Toolbar>
            </f:toolbar>
            <f:content>
                <Toolbar ariaLabelledBy="Title2">
                    <Title id="Title2" text="Office" level="H5" titleStyle="H5"/>
                    <ToolbarSpacer />
                    <Button icon="sap-icon://settings"/>
                </Toolbar>
                <Label text="Name" />
                <Input value="{SupplierName}" />
                <Label text="Street/No." />
                <Input value="{Street}">
                </Input>
                <Input value="{HouseNumber}">
                    <layoutData>
                        <l:GridData span="XL2 L1 M3 S4" />
                    </layoutData>
                </Input>
                <Label text="ZIP Code/City" />
                <Input value="{ZIPCode}">
                    <layoutData>
                        <l:GridData span="XL2 L1 M3 S4" />
                    </layoutData>
                </Input>
                <Input value="{City}" />
                <Label text="Country" />
                <Select id="country" selectedKey="{Country}">
                    <items>
                        <core:Item text="England" key="England"/>
                        <core:Item text="Germany" key="Germany"/>
                        <core:Item text="USA" key="USA"/>
                    </items>
                </Select>
                <Toolbar ariaLabelledBy="Title3">
                    <Title id="Title3" text="Online" level="H5" titleStyle="H5"/>
                    <ToolbarSpacer />
                    <Button icon="sap-icon://settings"/>
                </Toolbar>
                <Label text="Web" />
                <Input value="{Url}" type="Url" />
                <Label text="Twitter" />
                <Input value="{Twitter}" />
            </f:content>
        </f:SimpleForm>
    </VBox>
</mvc:View>

// Page.controller.js

sap.ui.define([
        'jquery.sap.global',
        'sap/ui/core/mvc/Controller',
        'sap/ui/model/json/JSONModel',
        'sap/ui/model/odata/v4/ODataModel'
    ], function(jQuery, Controller, JSONModel, ODataModel) {
    "use strict";

    var PageController = Controller.extend("sap.ui.layout.sample.SimpleFormToolbar.Page", {

        onInit: function (oEvent) {
            console.log("hello");

            jQuery.get({
                url: "/SupplierService/SupplierService.svc/Suppliers(12345)",
                success: function(data) {
                    console.log( "Recieved data: " + data);
                },
                error: function(error) {
                    // your error logic
                    console.log("Error while requesting odata: " + error);
                }
            });


        }

    });


    return PageController;

});

// index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="expires" content="0">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Fullscreen – with toolbar</title>

    <script id="sap-ui-bootstrap"
        src="https://sapui5.hana.ondemand.com/resources/sap-ui-core.js"
        data-sap-ui-theme="sap_belize"
        data-sap-ui-resourceroots='{
            "sap.ui.layout.sample.SimpleFormToolbar": "./",
            "sap.ui.demo.mock": "mockdata"
        }'
        data-sap-ui-compatVersion="edge"
        data-sap-ui-async="true"
        data-sap-ui-preload=""
        data-sap-ui-frameOptions="trusted"
        data-sap-ui-oninit="module:sap/ui/core/ComponentSupport">
    </script>
</head>

<body class="sapUiBody" id="content">
    <div data-sap-ui-component
        data-name="sap.ui.layout.sample.SimpleFormToolbar"
        data-height="100%"
        data-id="container"
        data-settings='{"id" : "sap.ui.layout.sample.SimpleFormToolbar"}'
        style="height: 100%">
    </div>
</body>
</html>

Я добавил вызов jquery только для того, чтобы посмотреть, работают ли odata.

Команда, используемая для решения проблемы CORS: «C: \ Program Files (x86) \ Google \ Chrome \ Application \ chrome.exe» --disable-web-security --disable-gpu --user-data-dir = ~ / chromeTemp

Я на самом деле указываю на службу одат в том же проекте. То же самое развертывается в Sap Cloud: https://supplierappp1014576trial.hanatrial.ondemand.com/SupplierApp/SupplierService.svc/

Спасибо за ваше время.

  • EDIT:

Добавлено решение в качестве ответа ниже.

1 Ответ

1 голос
/ 07 июля 2019
  • Ошибка:

    "не должен изменять свойство, прежде чем оно было прочитано", понимается как CORS-проблема .Принятие перекрестных запросов на стороне сервера может быть выполнено путем настройки web.xml.Обратите внимание, что это следует повторно оценить для производственного использования.

<filter>
          <filter-name>CorsFilter</filter-name>
          <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>CorsFilter</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
  • Ошибка:

    "$пакетный сбой - Ошибка: ошибка сети "устраняется путем изменения groupId на $ direct .Это означает, что мы отправляем отдельные сетевые вызовы в службу odata.


"models": {
            "": {
                "dataSource": "supplierOData",
                "settings" : {
                    "synchronizationMode" : "None",
                    "groupId": "$direct"
                }
            }
        },

Это убрало эти ошибки, и я вижу, что данные отображаются в полях формы.

Спасибо за внимание.

...