SAPクラウドSDKでJavaを使用してSFSFためのVDMを生成します。「「ODataFeedに変換応答に失敗しました」

kepair:

私はSFSFから情報を読み込み、アプリを構築しようとしています。このために、私は、システムにアクセスできるようにするにはSFSFのODataメタデータと仮想データモデル生成ツール(Mavenのプラグイン)を使用しています。私は、次の手順を実行しています:

  • (PowerShellを使用し)原型を経由してプロジェクトを取得します。
mvn archetype:generate "-DarchetypeGroupId=com.sap.cloud.sdk.archetypes" "-DarchetypeArtifactId=scp-cf-tomee" "-DarchetypeVersion=RELEASE"
  • 依存関係でアプリケーション\のpom.xmlに以下を追加します。
<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
</dependency>

プラグインには:

<plugin>
    <groupId>com.sap.cloud.sdk.datamodel</groupId>
    <artifactId>odata-generator-maven-plugin</artifactId>
    <version>3.13.0</version>
    <executions>
        <execution>
            <id>generate-consumption</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <inputDirectory>${project.basedir}/edmx</inputDirectory>
                <outputDirectory>${project.build.directory}/vdm</outputDirectory>
                <defaultBasePath>/odata/v2</defaultBasePath>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>3.0.0</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>${project.basedir}/vdm</source>
                            </sources>
                        </configuration>
                    </execution>
    </executions>
</plugin>
  • 以下からのODataメタデータファイルを取得https://apisalesdemo2.successfactors.eu/odata/v2/JobRequisition/$metadataと./application/edmxに置きます
  • (:OK企業ID @ユーザーで、接続は200である)先サービス(私の先)を作成し、基本的な認証と私のSFSFインスタンスを指すが、宛先を追加
  • manifest.ymlで宛先サービスを追加
  • 先を呼び出してデータを取得するためのJavaクラスを作成します。
package com.sap.sdk;

import com.google.gson.Gson;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

import com.sap.cloud.sdk.cloudplatform.connectivity.DestinationAccessor;
import com.sap.cloud.sdk.odatav2.connectivity.ODataException;

import com.sap.cloud.sdk.s4hana.connectivity.DefaultErpHttpDestination;
import com.sap.cloud.sdk.s4hana.connectivity.ErpHttpDestination;
import com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.rcmjobrequisition.JobRequisition;
import com.sap.cloud.sdk.s4hana.datamodel.odata.services.DefaultRCMJobRequisitionService;


@WebServlet("/req")
public class JobReqServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;
    private static final Logger logger = LoggerFactory.getLogger(JobReqServlet.class);

    private final ErpHttpDestination destination = DestinationAccessor.getDestination("sfsf-sdk-dest").asHttp()
            .decorate(DefaultErpHttpDestination::new);


    @Override
    protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
            throws ServletException, IOException {
        try {
            final List<JobRequisition> jobReqs = new DefaultRCMJobRequisitionService()
                .getAllJobRequisition()
                .execute(destination);
            response.setContentType("application/json");
            response.getWriter().write(new Gson().toJson(jobReqs));
        } catch (final ODataException e) {
            logger.error(e.getMessage(), e);
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            response.getWriter().write(e.getMessage());
        }
    }
}

すべてこれで(私は何も欠落していないと思う)、私が行います。

mvn clean install

そして:

cf push

すべては、うまくハローワールドサーブレットの作品を動作しますが、私はアクセス/ REQしようとすると、私が手:メタデータの要求を実行することができません。

しかし、私は私が(のpom.xmlでの)サービスのベースパスで遊ぶ場合、私は404のはSFSFから来てもらうためのアプリはSFSFに当たっていることがわかります。

VDMの発電機が稼働しているときにすべてをチェック、私はこれを参照してください:1.これは私がポンポンに与えているベースパスです。

<defaultBasePath>/odata/v2</defaultBasePath>
  1. 私は正しく、そのパスを選んで発電機を見ることができます:
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.DataModelGenerator -   Default base path:              /odata/v2/
  1. しかし、これは発電機が処理するものです。
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.ODataToVdmGenerator -   Title: RCMJobRequisition
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.ODataToVdmGenerator -   Raw URL: /odata/v2/SFODataSet
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.ODataToVdmGenerator -   Java Package Name: rcmjobrequisition
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.ODataToVdmGenerator -   Java Class Name: RCMJobRequisition

明らかに、そのSFODataSet URLでは正しくありません。ときにアプリを実行すると、... / ODATA / V2 / SFODataSet / $メタデータからメタデータを取得するためにトリングだし、それはそれを見つけていない理由です。SFODataSetはSFSFのメタデータから来ています:

<Schema Namespace="SFODataSet" xmlns="http://schemas.microsoft.com/ado/2008/09/edm" xmlns:sf="http://www.successfactors.com/edm/sf" xmlns:sap="http://www.sap.com/Protocols/SAPData">
      <EntityContainer Name="EntityContainer" m:IsDefaultEntityContainer="true">
        <EntitySet Name="JobOfferTemplate_Standard_Offer_Details" EntityType="SFOData.JobOfferTemplate_Standard_Offer_Details" sap:label="JobOfferTemplate_Standard_Offer_Details" sap:creatable="false" sap:updatable="false" sap:upsertable="false" sap:deletable="false">
          <Documentation>
            <Summary>Job Requisition Template</Summary>
            <LongDescription>These entities represent the job requisition template as defined in provisioning.</LongDescription>
            <sap:tagcollection>
              <sap:tag>Recruiting (RCM)</sap:tag>
              <sap:tag>RCM - Job Requisition</sap:tag>
            </sap:tagcollection>
          </Documentation>
        </EntitySet>
        <EntitySet Name="JobRequisitionLocale" EntityType="SFOData.JobRequisitionLocale" sap:label="JobRequisitionLocale" sap:creatable="false" sap:updatable="false" sap:upsertable="false" sap:deletable="false">
          <Documentation>
...

私は仕事には、このための方法を見つけることができません。あなたは私がここでの問題を見つけることができますか?

私が使用しています:

  • ApacheのMavenの3.6.2
  • SAPクラウドSDK 3.13.0

編集:SFSFメタデータファイルが利用可能であるhttps://api.sap.com/ 私はこのアプリのために使用しています1はSFSFのためである-ここでは、仕事求人利用可能: https://api.sap.com/api/RCMJobRequisition /概要

そこから、あなたはEDMX仕様をダウンロードすることができます。これらは、実際のSFSFインスタンスに接続されていない「モック」APIの、ですが、問題は同じです。

これを行うには、私は主に二つのブログを、次のよ。

また、私は必要に応じて、これがクリアされた後、私はそれのために別の質問を開きますようthaの最後の部分を削除しました。

おかげで、

kepair

MatKuhr:

必要であれば、私は後で詳しくに部分的な答えと編集との開始します。

URLについて:

あなたが観察行動は意図的なものです。次のようにリクエストの完全なURLがアセンブルされます。リンク先URLは、+サービスパス+サービス名+エンティティ+「?」+クエリパラメータ。だから、あなたのケースであるかもしれないこと。

https://my.host.domain/odata/v2/JobRequisitions/MyEntity
Destination: https://my.host.domain
Service Path: /odata/v2
Service name: JobRequisitions
Entity: MyEntity

発電機は、デフォルトからのベースパスを組み立てますservice path + service nameservice name実際にEDMXの名前空間から引き出されます。あなたのサービスのURLは、それがある方法で生成されている理由です。

その理由は単純です:一つは、同時に複数のサービスのためのVDMを生成することがあります。これらのサービスはすべて、サービス名自体を除いて、同じエンドポイントの下にさらされています。1つの構成ですべてのVDMsを生成するために、我々は、発電機に「サービス・パス」を指定することができ、発電機がEDXM自体からサービス名を取得します。

生成されたベースパスを上書きするあなたのアプローチが働く必要があることをその手段はそう:

final List<JobRequisition> jobReqs = new DefaultRCMJobRequisitionService()
                .withServicePath("odata/v2/JobRequisition")
                .getAllJobRequisition()
                .execute(destination);

あなたの質問の最後にエラーメッセージが少し私には解析中に問題のように見えます。しかし、その1に取り組むためには、さらに我々は、完全なスタックトレースとHTTPログ出力が必要になります。私たちは、メタデータへのアクセス権を持っている場合にも、我々は唯一の問題を再現することができます。あなたが提供されるリンクは、ユーザー名/パスワードによる認証が必要です。

上記のご質問は、すでにかなり包括的であるので、私はあなたがこの2つの問題を分離し、これは本当に独立した問題であることが判明した場合、新しい質問を作成することをお勧めします。また、これは他の人のために両方の質問がより適切になります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=8327&siteId=1