Создание пользовательской службы OData v2 с источником данных из S / 4HANA Cloud с помощью S / 4HANA Cloud SDK: ошибка web.xml - PullRequest
0 голосов
/ 02 апреля 2019

Я все еще пытаюсь создать пользовательскую службу OData v2 в java с источником данных S / 4HANA Cloud с использованием S / 4HANA Cloud SDK.Внес изменения в web.xml, как предложено в ответе на этот вопрос 26 марта, но я получаю сообщение об ошибке в файле web.xml (см. Ниже) - в нем говорится, что init-param в сервлете является недопустимым содержимым.

Кроме того, когда я пытаюсь получить доступ к метаданным службы через браузер с $ metadata, появляется сообщение «служба не найдена», а журнал «Трассировка по умолчанию» в облачной платформе содержит следующее:

com.sap.cloud.sdk.service.prov.v2.rt.cdx.CDXRuntimeDelegate anonymous 
https-jsse-nio-8041-exec-7 na masssalesorders2application web ha******* 
na#na#na#na#No Runtime Providers present for the URL and 
languageCFMassSalesOrdersSrv

Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0" metadata-complete="false">

    <login-config>
        <auth-method>FORM</auth-method>
    </login-config>

    <session-config>
        <session-timeout>20</session-timeout>
    </session-config>

    <security-role>
        <role-name>Everyone</role-name>
    </security-role>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>All SAP Cloud Platform users</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>Everyone</role-name>
        </auth-constraint>

        <user-data-constraint>
            <transport-guarantee>NONE</transport-guarantee>
            <!-- Use CONFIDENTIAL as transport guarantee to ensure SSL connection (HTTPS) on public deployments
            <transport-guarantee>CONFIDENTIAL</transport-guarantee> -->
        </user-data-constraint>
    </security-constraint>

    <filter>
        <filter-name>RestCsrfPreventionFilter</filter-name>
        <filter-class>org.apache.catalina.filters.RestCsrfPreventionFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>RestCsrfPreventionFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>HttpSecurityHeadersFilter</filter-name>
        <filter-class>com.sap.cloud.sdk.cloudplatform.security.servlet.HttpSecurityHeadersFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HttpSecurityHeadersFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>HttpCachingHeaderFilter</filter-name>
        <filter-class>com.sap.cloud.sdk.cloudplatform.security.servlet.HttpCachingHeaderFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HttpCachingHeaderFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>ODataServlet</servlet-name>
        <servlet-class>org.apache.olingo.odata2.core.servlet.ODataServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
        <init-param>
            <param-name>org.apache.olingo.odata2.service.factory</param-name>
            <param-value>
                com.sap.cloud.sdk.service.prov.v2.rt.core.CloudSDKODataServiceFactory
            </param-value>
        </init-param>
        <init-param>
            <param-name>org.apache.olingo.odata2.path.split</param-name>
            <param-value>1</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>ODataServlet</servlet-name>
        <url-pattern>/odata/v2/*</url-pattern>
    </servlet-mapping>
    <context-param>
        <param-name>package</param-name>
        <param-value>com.********.s4sdk</param-value>
    </context-param>
    <listener>
        <listener-class>
        com.sap.cloud.sdk.service.prov.v2.rt.core.web.ServletListener
        </listener-class>
    </listener>

</web-app>

Спасибо - ошибка в файле web.xml, показанная IntelliJ, исчезла, когда я поместил загрузку при запуске за записями init-param.

Когда я использую этот URL в Chrome: https://masssalesorders2appli********.us3.hana.ondemand.com/masssalesorders2-application/odata/v2/CFMassSalesOrdersSrv/$metadata,, браузер возвращает «Служба недоступна».

Журнал «Трассировка по умолчанию» облачной платформы имеет 3 строки - каждое сообщение длякаждая строка выглядит следующим образом:

2019 04 02 14:01:46#+00#ERROR#com.sap.cloud.sdk.service.prov.v2.rt.cdx.CDXRuntimeDelegate##anonymous#https-jsse-nio-8041-exec-6#na#********#masssalesorders2application#web#********#na#na#na#na#No Runtime Providers present for the URL and languageCFMassSalesOrdersSrv 

2019 04 02 14:01:46#+00#ERROR#com.sap.cloud.sdk.service.prov.v2.rt.cdx.CDXRuntimeDelegate##anonymous#https-jsse-nio-8041-exec-6#na#********#masssalesorders2application#web#********#na#na#na#na#No Runtime Providers present for the URL and languageCFMassSalesOrdersSrv

2019 04 02 14:01:46#+00#ERROR#com.sap.cloud.sdk.service.prov.v2.rt.core.CloudSDKODataErrorCallback##anonymous#https-jsse-nio-8041-exec-6#na#********#masssalesorders2application#web#********#na#na#na#na#Request URL: /masssalesorders2-application/odata/v2/CFMassSalesOrdersSrv/$metadata
StatusCode:500 org.apache.olingo.odata2.api.exception.ODataInternalServerErrorException: Service unavailable.
at org.apache.olingo.odata2.core.servlet.ODataServlet.createServiceUnavailableResponse(ODataServlet.java:373)
at org.apache.olingo.odata2.core.servlet.ODataServlet.handleRequest(ODataServlet.java:210)
at org.apache.olingo.odata2.core.servlet.ODataServlet.handle(ODataServlet.java:115)
at org.apache.olingo.odata2.core.servlet.ODataServlet.service(ODataServlet.java:85)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomee.webservices.CXFJAXRSFilter.doFilter(CXFJAXRSFilter.java:83)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.openejb.server.httpd.EEFilter.doFilter(EEFilter.java:65)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.sap.core.communication.server.CertValidatorFilter.doFilter(CertValidatorFilter.java:157)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.sap.cloud.sdk.cloudplatform.servlet.RequestContextServletFilter.lambda$doFilter$0(RequestContextServletFilter.java:197)
at com.sap.cloud.sdk.cloudplatform.servlet.RequestContextCallable.call(RequestContextCallable.java:131)
at com.sap.cloud.sdk.cloudplatform.servlet.RequestContextServletFilter.doFilter(RequestContextServletFilter.java:209)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.sap.cloud.sdk.cloudplatform.security.servlet.HttpCachingHeaderFilter.doFilter(HttpCachingHeaderFilter.java:82)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.sap.cloud.sdk.cloudplatform.security.servlet.HttpSecurityHeadersFilter.doFilter(HttpSecurityHeadersFilter.java:42)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.filters.RestCsrfPreventionFilter.doFilter(RestCsrfPreventionFilter.java:113)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
at com.sap.core.connectivity.jco.session.ext.RequestTracker.invoke(RequestTracker.java:55)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:610)
at com.sap.cloud.runtime.impl.bridge.security.AbstractAuthenticator.invoke(AbstractAuthenticator.java:206)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at com.sap.core.tenant.valve.TenantValidationValve.invokeNextValve(TenantValidationValve.java:182)
at com.sap.core.tenant.valve.TenantValidationValve.invoke(TenantValidationValve.java:97)
at com.sap.js.statistics.tomcat.valve.RequestTracingValve.callNextValve(RequestTracingValve.java:113)
at com.sap.js.statistics.tomcat.valve.RequestTracingValve.invoke(RequestTracingValve.java:59)
at com.sap.core.js.monitoring.tomcat.valve.RequestTracingValve.invoke(RequestTracingValve.java:27)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:836)

Когда я использую тот же URL в Postman с «GET», в «Трассировке по умолчанию» строки не появляются, но в «HTTP Access Log» появляется строка - она ​​возвращает'200', но метаданные не возвращаются.Так как это мой первый проект по созданию службы OData v2, которая обращается к S / 4HANA Cloud API на серверной части, я не уверен, правильно ли я это настроил:

Вот началокод Java:

@WebServlet("/salesordercreate")
public class MassSalesOrdersServlet extends HttpServlet
{
    private static final Logger logger = CloudLoggerFactory.getLogger(MassSalesOrdersServlet.class);

    @Create(serviceName = "CFMassSalesOrdersSrv", entity = "MassSalesOrderType")
    public CreateResponse createMassSalesOrders(CreateRequest createRequest)
    {
        MassSalesOrdersEntityType massSalesOrderData = createRequest.getDataAs(MassSalesOrdersEntityType.class);
       .
       .
       .
        try {
            SalesOrder salesOrderPosted = new SalesOrderCreateFluentHelper("", salesOrder).execute(new ErpConfigContext("S4_Sandbox_Sales_Orders"));
            logger.error(salesOrderPosted.getSalesOrder());

            MassSalesOrdersEntityType massSalesOrderCreated = new MassSalesOrdersEntityType();

            massSalesOrderCreated.setSalesOrderNbrStart(salesOrderPosted.getSalesOrder());
     .
     .
     .
                return CreateResponse.setSuccess()
                    .setData(massSalesOrderCreated).response();

        }

1 Ответ

0 голосов
/ 04 апреля 2019

Требуется реализовать собственный настраиваемый обработчик для службы, определенной с помощью модели программирования приложений SAP Cloud .

Такой настраиваемый обработчик должен быть определен в простом классе Java, а несервлет.Модель программирования содержит свой собственный сервлет, который обрабатывает все запросы к службе OData (как вы определили в своем файле web.xml).

Пожалуйста, удалите специфичные для сервлета части вашего определения класса (аннотация WebServlet + суперкласс)).

Если предположить, что все остальное, например определение службы в CDS, настроено правильно, должна работать следующая реализация пользовательского обработчика:

public class MassSalesOrdersServlet
{
    @Create(serviceName = "CFMassSalesOrdersSrv", entity = "MassSalesOrderType")
    public CreateResponse createMassSalesOrders(CreateRequest createRequest)
    {
        // your implementation goes here
    }
}

справочные страницы дать более подробную информацию о пользовательской логике в модели программирования приложений SAP Cloud

Относительно вашей реализации с использованием виртуальной модели данных OData SAP S / 4HANA Cloud SDK: используйте этот сервис для создания запроса на создание, а не для создания экземплярабеглый помощник напрямую:

new DefaultSalesOrderService().createSalesOrder(salesOrder).execute(...)
...