Я все еще пытаюсь создать пользовательскую службу 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();
}