有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

odata如何使用SAP Cloud SDK 3.2.0在Java中检索目标?

我正在开发一个使用SAP Cloud SDK版本3.2.0的Java应用程序。我怀疑目的地是如何被找回的。当我通过在本地机器上运行应用程序来测试应用程序时,我可以向公开的OData服务发送POST请求,而不会出现问题,问题是当我在Neo环境的SAP云平台开发帐户中部署应用程序时,在这里,我创建了一个名为ErpQueryEndpoint的目的地,并使用SAP Cloud Connector建立连接,如下所示:

这是应用程序代码,首先调用bpCreateExtended方法,然后调用executeAsyncCall方法,这将异步执行:

        public Object executeAsyncCall(BpCreateBasicRequest bpCreateRequest) {
        ...
    
    try {

        ODataCreateRequestImpl createRequest = new ODataCreateRequestImpl("/sap/opu/odata/sap/ZAS_BP_CREATION_SRV",
                           "BP_DATASet", bodyAsMap, null, null, null, headersAsMap, null, false, null, null, false);
        
        //Creating destination at runtime
        DefaultDestination dest = DefaultDestination.builder()
            .property("Name", "ErpQueryEndpoint")
            .property("URL", "http://crmdev:4431")
            .property("Type", "HTTP")
            .property("Authentication", "BasicAuthentication")
            .property("User", abapUser)
            .property("Password", abapPass)
            .build();
            
        HttpDestination destination = dest.asHttp();
        HttpClient httpClient = HttpClientAccessor.getHttpClient(destination);      
        Map<String, Object> resp = createRequest.execute(httpClient).asMap();
        jsonResponse = new JSONObject(resp);

    } catch (HttpServerErrorException e) {
        logger.info("504 Gateway Timeout first steep. SCP Timeout " + e.getMessage());
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    ...
    
    return jsonResponse;
}


public Object bpCreateExtended(BpCreateBasicRequest bpCreateRequest) throws IOException {

    this.conf = ResilienceConfiguration.of(AccountBFimpl.class);
    Object response = null;


    CompletableFuture<Object> futureFirstSteep = ResilienceDecorator.queueCallable(() ->
            executeAsyncCall(bpCreateRequest), conf);

    return (JSONObject) response;
}

如果应用程序已部署在SAP Cloud Platform Neo开发帐户中,则发送POST请求时会出现以下错误:

ERROR#com.sap.cloud.sdk.odatav2.connectivity.cache.metadata.GuavaMetadataCache##S0020495660#ForkJoinPool.commonPool-worker-2#na#gfna57xvah#atlantidaapi#web##na#na#na#na#Error occurred while populating metadata : java.net.UnknownHostException: crmdev: Name or service not known

在executeAsyncCall方法中,我在运行时创建目标,但我不知道实现是否正确,或者我是否可以做一些不同的事情来在SAP Cloud Platform中获取开发帐户的目标。有人能帮我找到解决办法吗

这是我的pom的内容。xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.atlantida.services</groupId>
    <artifactId>account</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>atlantida</name>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.sap.cloud.sdk</groupId>
                <artifactId>sdk-bom</artifactId>
                <version>3.2.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <properties>
        <java-version>1.8</java-version>
        <springframework.version>5.1.8.RELEASE</springframework.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>4.11</junit.version>
        <jackson-version>2.9.2</jackson-version>
        <lombok.version>1.18.8</lombok.version>

        <jcl.slf4j.version>1.7.12</jcl.slf4j.version>
        <logback.version>1.1.3</logback.version>

        <!-- if you are behind a proxy use the following two properties to configure your proxy. Default: None -->
        <proxy.host />
        <proxy.port />
        <non.proxy.hosts />

        <!-- Properties that are related to the SAP Cloud Platform. -->
        <scp.sdkVersion>1.44.12</scp.sdkVersion>

        <!-- this is the location of your local SAP CP Neo runtime -->
        <scp.sdkInstallPath>${project.basedir}/scp/sdk-${scp.sdkVersion}</scp.sdkInstallPath>
        <scp.sdkLocalServerContentPath>${project.basedir}/localServerContent</scp.sdkLocalServerContentPath>
        <scp.sdkErpEndpoint>${scp.sdkInstallPath}/server/config_master/service.destinations/destinations/ErpQueryEndpoint</scp.sdkErpEndpoint>

        <scp.sdkSymbolicLink>${project.basedir}/scp/sdk</scp.sdkSymbolicLink>
        <scp.sdkNeoCmdExtension>.sh</scp.sdkNeoCmdExtension>
        <scp.sdkNeoCmd>${scp.sdkInstallPath}/tools/neo${scp.sdkNeoCmdExtension}</scp.sdkNeoCmd>
        <scp.sdkLocalServer>${scp.sdkInstallPath}/server</scp.sdkLocalServer>

        <scp.skipInstallSdk>false</scp.skipInstallSdk>
        <scp.skipDeploy>false</scp.skipDeploy>
        <scp.skipPutDestination>false</scp.skipPutDestination>
        <scp.skipRestart>false</scp.skipRestart>
        <scp.skipRollingUpdate>true</scp.skipRollingUpdate>

        <scp.vmArguments />
        <scp.vmSize>lite</scp.vmSize>
        <scp.vmMinProcesses>1</scp.vmMinProcesses>
        <scp.vmMaxProcesses>1</scp.vmMaxProcesses>

        <scp.app />
        <scp.host />
        <scp.account />
        <scp.username />
        <scp.password />

        <!-- Required for SAP CP user session management and audit logging. -->
        <scp.warImportPackage>com.sap.security.auth.service,com.sap.security.um.service.api,com.sap.core.service.auditlog.impl,com.sap.cloud.auditlog,com.sap.cloud.auditlog.exception,com.sap.cloud.auditlog.extension</scp.warImportPackage>

        <!-- Defines whether the deployment is productive or not. -->
        <productive />
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson-version}</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson-version}</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1.1</version>
        </dependency>

        <!-- Bridge logging from JCL to SLF4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${jcl.slf4j.version}</version>
        </dependency>

        <!-- logback -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20190722</version>
        </dependency>

        <dependency>
            <groupId>com.sap.cloud.sdk.cloudplatform</groupId>
            <artifactId>scp-neo</artifactId>
        </dependency>

        <dependency>
            <groupId>com.sap.cloud.servicesdk</groupId>
            <artifactId>odatav2-connectivity</artifactId>
            <version>1.32.5</version>
        </dependency>

        <dependency>
            <groupId>com.sap.cloud.sdk.cloudplatform</groupId>
            <artifactId>security-servlet</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.sap.cloud</groupId>
            <artifactId>neo-javaee7-wp-api</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>atlantida</finalName>

        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-enforcer-plugin</artifactId>
                    <version>3.0.0-M2</version>
                    <executions>
                        <execution>
                            <id>SAP Cloud SDK Project Structure Checks</id>
                            <goals>
                                <goal>enforce</goal>
                            </goals>
                            <configuration>
                                <rules>
                                    <requireMavenVersion>
                                        <version>3.5</version>
                                    </requireMavenVersion>
                                    <requireJavaVersion>
                                        <version>${java.version}</version>
                                    </requireJavaVersion>
                                    <reactorModuleConvergence />
                                </rules>
                                <fail>true</fail>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
                    <configuration>
                        <attachClasses>true</attachClasses>
                        <archive>
                            <manifestEntries>
                                <Version>${project.version}</Version>
                                <Import-Package>${scp.warImportPackage}</Import-Package>
                            </manifestEntries>
                        </archive>
                        <webResources>
                            <resources>
                                <filtering>true</filtering>
                                <directory>src/main/webapp</directory>
                                <includes>
                                    <include>**/web.xml</include>
                                </includes>
                            </resources>
                        </webResources>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>3.1.1</version>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>com.sap.cloud</groupId>
                                <artifactId>neo-javaee7-wp-sdk</artifactId>
                                <version>${scp.sdkVersion}</version>
                                <type>zip</type>
                                <overWrite>false</overWrite>
                                <outputDirectory>${scp.sdkInstallPath}</outputDirectory>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </plugin>

                <!-- Plugin for deployment to SAP Cloud Platform Neo. -->
                <plugin>
                    <groupId>com.sap.cloud</groupId>
                    <artifactId>neo-javaee7-wp-maven-plugin</artifactId>
                    <version>${scp.sdkVersion}</version>
                    <executions>
                        <execution>
                            <id>stop</id>
                            <phase>install</phase>
                            <goals>
                                <goal>stop</goal>
                            </goals>
                            <configuration>
                                <skip>${scp.skipRestart}</skip>
                            </configuration>
                        </execution>
                        <execution>
                            <id>deploy</id>
                            <phase>install</phase>
                            <goals>
                                <goal>deploy</goal>
                            </goals>
                            <configuration>
                                <skip>${scp.skipDeploy}</skip>
                                <vmArguments>${scp.vmArguments}</vmArguments>
                            </configuration>
                        </execution>
                        <execution>
                            <id>start</id>
                            <phase>install</phase>
                            <goals>
                                <goal>start</goal>
                            </goals>
                            <configuration>
                                <skip>${scp.skipRestart}</skip>
                            </configuration>
                        </execution>
                        <execution>
                            <id>rolling-update</id>
                            <phase>install</phase>
                            <goals>
                                <goal>rolling-update</goal>
                            </goals>
                            <configuration>
                                <skip>${scp.skipRollingUpdate}</skip>
                            </configuration>
                        </execution>
                    </executions>
                    <configuration>
                        <sdkInstallPath>${scp.sdkInstallPath}</sdkInstallPath>
                        <skip>${scp.skipInstallSdk}</skip>

                        <application>${scp.app}</application>
                        <source>${project.build.directory}/${project.build.finalName}.war</source>

                        <vmArguments>${scp.vmArguments}</vmArguments>
                        <size>${scp.vmSize}</size>
                        <minimumProcesses>${scp.vmMinProcesses}</minimumProcesses>
                        <maximumProcesses>${scp.vmMaxProcesses}</maximumProcesses>

                        <host>${scp.host}</host>
                        <account>${scp.account}</account>
                        <user>${scp.username}</user>
                        <password>${scp.password}</password>
                        <synchronous>true</synchronous>

                        <httpProxyHost>${proxy.host}</httpProxyHost>
                        <httpProxyPort>${proxy.port}</httpProxyPort>
                        <httpsProxyHost>${proxy.host}</httpsProxyHost>
                        <httpsProxyPort>${proxy.port}</httpsProxyPort>

                        <consoleCommand />
                        <consoleHttpProxyHost>${proxy.host}</consoleHttpProxyHost>
                        <consoleHttpProxyPort>${proxy.port}</consoleHttpProxyPort>
                        <consoleHttpsProxyHost>${proxy.host}</consoleHttpsProxyHost>
                        <consoleHttpsProxyPort>${proxy.port}</consoleHttpsProxyPort>

                        <dbsystem />
                        <dbSize />
                        <dbUser />
                    </configuration>
                </plugin>

                <!-- Plugin for deployment to local runtime of SAP Cloud Platform Neo. -->
                <plugin>
                    <groupId>com.sap.cloud.sdk.plugins</groupId>
                    <artifactId>scp-neo-maven-plugin</artifactId>
                    <version>3.2.0</version>
                    <configuration>
                        <sdkPlugin>neo-javaee7-wp-maven-plugin</sdkPlugin>
                        <sdkPluginVersion>${scp.sdkVersion}</sdkPluginVersion>
                        <sdkInstallPath>${scp.sdkInstallPath}</sdkInstallPath>
                        <sdkSymbolicLink>${scp.sdkSymbolicLink}</sdkSymbolicLink>
                        <sdkServerContentPath>${scp.sdkLocalServerContentPath}</sdkServerContentPath>
                        <source>${project.build.directory}/${project.build.finalName}.war</source>
                        <proxyHost>${proxy.host}</proxyHost>
                        <proxyPort>${proxy.port}</proxyPort>
                        <httpNonProxyHosts>${non.proxy.hosts}</httpNonProxyHosts>
                        <destinations>
                            <destination>
                                <path>${scp.sdkErpEndpoint}</path>
                                <username>achacon</username>
                                <password>****</password>
                                <url>http://crmdev:4431</url>
                            </destination>
                        </destinations>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>

        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.sap.cloud.sdk.plugins</groupId>
                <artifactId>usage-analytics-maven-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>usage-analytics</goal>
                        </goals>
                        <configuration>
                            <skipUsageAnalytics>false</skipUsageAnalytics>
                            <generateSalt>true</generateSalt>
                                <!--
                                Note: A random salt is auto-generated once the project is built for the first time.
                                Please keep the generated salt in the POM file, for example, when pushing to git.

                                To learn more, visit: https://blogs.sap.com/2018/10/23/usage-analytics-s4sdk/
                                -->
                            <salt>5d5e4e1e8a5f05d547fe8880f65173bda150a670f91f3657b970eaa9e7a4d392</salt>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <!--
        Profiles that are used to set the Neo SDK "neo" command extension ("neo.sh" or "neo.cmd")
        -->
        <profile>
            <id>windows</id>
            <activation>
                <os>
                    <family>windows</family>
                </os>
            </activation>
            <properties>
                <scp.sdkNeoCmdExtension>.bat</scp.sdkNeoCmdExtension>
            </properties>
        </profile>
        <profile>
            <id>unix</id>
            <activation>
                <os>
                    <family>unix</family>
                </os>
            </activation>
            <properties>
                <scp.sdkNeoCmdExtension>.sh</scp.sdkNeoCmdExtension>
            </properties>
        </profile>

        <!-- Profile setting properties for deploying to the local SAP CP runtime. -->
        <profile>
            <id>local-deploy</id>
            <activation>
                <property>
                    <name>!scp.app</name>
                </property>
            </activation>
            <properties>
                <scp.skipInstallSdk>true</scp.skipInstallSdk>
                <scp.skipDeploy>true</scp.skipDeploy>
                <scp.skipPutDestination>true</scp.skipPutDestination>
                <scp.skipRestart>true</scp.skipRestart>
                <scp.skipRollingUpdate>true</scp.skipRollingUpdate>
            </properties>
        </profile>

        <!-- Profile setting properties for deploying a productive version to SAP CP. -->
        <profile>
            <id>scp-deploy</id>
            <activation>
                <property>
                    <name>productive</name>
                </property>
            </activation>
            <properties>
                <scp.skipInstallSdk>false</scp.skipInstallSdk>
                <scp.skipDeploy>true</scp.skipDeploy>
                <scp.skipPutDestination>false</scp.skipPutDestination>
                <scp.skipRestart>true</scp.skipRestart>
                <scp.skipRollingUpdate>false</scp.skipRollingUpdate>
            </properties>
        </profile>
    </profiles>
</project>

这是我的ErpQueryEndpoint文件:https://i.imgur.com/jIWsa4o.jpg


共 (2) 个答案

  1. # 1 楼答案

    而不是

    Map<String, Object> resp = createRequest.execute(httpClient).asMap();
    

    请使用

    Map<String, Object> resp = createRequest.execute("ErpQueryEndpoint").asMap();
    

    您不必手动创建目的地

    或者,您也可以使用:

    Destination dest = DestinationAccessor.getDestination("ErpQueryEndpoint");
    

    原因:默认情况下,目的地使用代理类型“Internet”(无代理),但您希望“OnPremise”与云连接器建立连接


    更新:使用SAP Cloud SDK3时,请同时使用服务SDK的合适依赖项。这意味着,不是

            <dependency>
                <groupId>com.sap.cloud.servicesdk</groupId>
                <artifactId>odatav2-connectivity</artifactId>
                <version>1.32.5</version>
            </dependency>
    

    使用:

            <dependency>
                <groupId>com.sap.cloud.servicesdk</groupId>
                <artifactId>odatav2-connectivity-sdk3</artifactId>
                <version>1.36.2</version>
            </dependency>
    
  2. # 2 楼答案

    我按照Alex的建议设法解决了问题,并在CompletableFuture下面添加了以下代码行:

    try {
             response = futureFirstSteep.get(5000, TimeUnit.MILLISECONDS);
            } catch (TimeoutException e) {
            logger.info("TimeoutException: ", e.getMessage());
            } catch (InterruptedException e) {
            logger.info("InterruptedException: ", e.getMessage());
            } catch (ExecutionException e) {
            logger.info("ExecutionException: ", e.getMessage());
        }
    

    在这种情况下,CompletableFuture课程的get(long, TimeUnit)方法是成功的关键,虽然我不知道为什么等待这5秒钟来响应请求,是在我使用ResilienceDecorator的queueCallable方法异步执行代码时防止生成错误的原因。非常感谢你们的帮助Alex和Emdee