0

再帰問題の解決策が思いつかないようです。したがって、依存している他のバージョン オブジェクトへの参照のリストを保持するこの Version オブジェクトがあります。

バージョン

{
  "id": "id1",
  "version": "1",
  "dependencies": [
    {
      "id": "id2"
    },
    {
      "id": "id3"
    }
  ]
}

このオブジェクトを取得するときは、最終的に終了するまで、その依存関係と依存関係の依存関係も取得する必要があります。これは次のようになります。

バージョンDto

{
  "id": "id1",
  "version": "1",
  "dependencies": [
    {
      "id": "id2",
      "version": "2",
      "dependencies": [
        {
          "id": "id4",
          "version": "4",
          "dependencies": []
        }
      ]
    },
    {
      "id": "id3",
      "version": "3",
      "dependencies": []
    }
  ]
}

これは、バージョンを取得するための再帰関数です

public VersionDto getVersion(String id)
{
    //Retrieves from database
    Version version = versionDAO.getVersion(id);

    //Convert to Dto (basic fields)
    VersionDto versionDto = new VersionDto(version);

    //Recursivly retrieve dependencies 
    for (Map<String, String> dep : version.getDependencies()) {
        VersionDto dto = new VersionDto();

        //Recursive call
        dto = getVersion(dep.get("id"));
        versionDto.getDependencies().add(dto);
    }

    return versionDto;
}

ただし、バージョンが v1 -> v2 -> v4 -> v1 のようにネストされた依存関係の 1 つに依存し、無限の繰り返しが発生する可能性がある場合、無限ループの可能性の問題に遭遇します。

この無限ループをどのように解決して防ぐことができるので、以前にすべての準備が整ったバージョンが発生した場合、それをスキップする必要がありますか?

編集:グローバルリストを使用したソリューション

public VersionDto getVersion(String id)
{

    //Check global list contains version
    if (visited.contains(id)) {
        return null;
    }

    visited.add(docId);

    //Retrieves from database
    Version version = versionDAO.getVersion(id);

    //Convert to Dto (basic fields)
    VersionDto versionDto = new VersionDto(version);

    //Recursivly retrieve dependencies 
    for (Map<String, String> dep : version.getDependencies()) {
        VersionDto dto = new VersionDto();

        //Recursive call
        dto = getVersion(dep.get("id"));
        if(dep!= null) {
        versionDto.getDependencies().add(dto);
        }
    }

    return versionDto;
}
4

3 に答える 3

1

無限再帰ループの問題は、Jackson ライブラリを使用して非常に効率的に解決できます。Jackson ライブラリは、永続化のために Hibernate/JPA を使用している場合に特に便利です。つまり、 @JsonManagedReference および @JsonBackReference アノテーションがケースに適用されます。

JPA エンティティ コードを表示していないため、これらの注釈を正確にどこに配置する必要があるかはわかりません。ただし、それらの使用方法の良い例は、次の場所にあります。

http://springquay.blogspot.com/2016/01/new-approach-to-solve-json-recursive.html

お役に立てば幸いです。

于 2019-11-27T13:57:30.523 に答える