web-dev-qa-db-ja.com

Spring Data Restにリストを投稿するにはどうすればよいですか?

私は この例 に従いました。これにより、一意のPersonオブジェクトを投稿できます。 Personのコレクションを一度に投稿できるRESTサービスが必要です。たとえば、1回の呼び出しで多数のTeamオブジェクトを含むPersonという名前のリスト/任意のコレクションです。

つまり、私の質問はOneToManyの関係についてではなく、RESTリクエストで各人を送信します。このトピックは よく答えられています です。

@RepositoryRestResourceまたはSpringDataRestの別の機能を利用してPersonオブジェクトのコレクションを送信したいと思います。これはSpringData Restで可能ですか、それともコントローラーを作成してリストを受け取り、Teamリストを解析して各Personを挿入することで回避する必要がありますか?

この機能リクエスト を見つけました。これは、最近のSpring Rest Dataに探しているものがないことを答えているようですが、よくわかりません。

私のビジネス要件では、アプリケーションAが注文のリストをアプリケーションBに投稿し、将来の処理のためにデータベースに保存する必要があるため、Spring Data Restについて読んでサンプルを作成した後、そのクリーンなアーキテクチャが素晴らしく、非常に適していることがわかりました。リストを投稿する方法がわからなかったという事実を除いて、私の要件のために。

15
Jim C

さて、春のデータレストではそれを行うことはできません。ドキュメントを読むだけで、コレクションリソースにリストを投稿することについての言及がないことがわかります。

この理由は私にはわかりませんが、1つには、REST自体は、バッチ操作を実行する方法を実際には指定していません。したがって、その機能にどのようにアプローチする必要があるかは不明です。あなたPOSTリストをコレクションリソースに?または、エンティティにパッチを適用、削除、追加できる/someentity/batchのようなリソースを1つのバッチでエクスポートする必要がありますか?リストを追加する場合は、どのようにすべきですか? IDを返しますか?単一のPOST to collection spring-data-rest return id in Location header。バッチ追加の場合、これは実行できません。

これは、spring-data-restにバッチ操作がないことを正当化するものではありません。彼らはこのIMHOを実装する必要がありますが、少なくとも、なぜ彼らがそれを見逃しているのかを理解するのに役立ちます。

ただし、/ someentity/batchを適切に処理する独自のコントローラーをプロジェクトにいつでも追加でき、それからライブラリを作成して、別のプロジェクトで使用できるようにすることもできます。または、spring-data-restをフォークして、この機能を追加します。私はそれがどのように機能するかを理解しようとしましたが、これまで失敗しました。しかし、あなたはおそらくそれをすべて知っていますよね?

これには機能リクエストがあります

13
user1685095

user1685095answer に基づいて、カスタムコントローラーPersonRestControllerを作成し、投稿collection of PersonSpring-date-restによってまだ公開されていないようです

@RepositoryRestController
@RequestMapping(value = "/persons")
public class PersonRestController {
private final PersonRepository repo;
@Autowired
public AppointmentRestController(PersonRepository repo) {
    this.repo = repo;
}

@RequestMapping(method = RequestMethod.POST, value = "/batch", consumes = "application/json", produces = "application/json")
public @ResponseBody ResponseEntity<?> savePersonList(@RequestBody Resource<PersonWrapper<Person>> personWrapper,
        PersistentEntityResourceAssembler assembler) {
    Resources<Person> resources = new Resources<Person>(repo.save(personWrapper.getContent()));
    //TODO add extra links `assembler`
    return ResponseEntity.ok(resources);
}

}

PersonWrapper修正する:

START_ARRAYトークンからorg.springframework.hateoas.Resourcesのインスタンスを逆シリアル化できません\ n [ソース:Java.io.PushbackInputStream@3298b722;行:1、列:1]

更新

public class PersonWrapper{
 private List<Person> content;

public List<Person> getContent(){
return content;
}

public void setContent(List<Person> content){
this.content = content;
}
}

public class Person{
private String name;
private String email;
// Other fields

// GETTER & SETTER 
}
5
Khaled Lela
@RequestMapping(method=RequestMethod.POST, value="/batchInsert", consumes = "application/json", produces = "application/json")
@ResponseBody
public ResponseEntity<?> batchInsert(@RequestBody Resources<Person> people, PersistentEntityResourceAssembler assembler) throws Exception {
    Iterable<Person> s = repo.save( people.getContent() ); // save entities

    List<PersistentEntityResource> list = new ArrayList<PersistentEntityResource>();
    Iterator<Sample> itr = s.iterator();
    while(itr.hasNext()) {
        list.add( assembler.toFullResource( itr.next() ) );
    }

    return ResponseEntity.ok( new Resources<PersistentEntityResource>(list) );
}
1
wotboy

@RequestBody List<Resource<MyPojo>>を使おうとしました。リクエスト本文にリンクが含まれていない場合は正常に機能しますが、要素にリンクが含まれている場合、サーバーはリクエスト本文を逆シリアル化できませんでした。

次に、@RequestBody Resources<MyPojo>を使用しようとしましたが、リストのデフォルト名がわかりませんでした。

最後に、List<Resource<MyPojo>>を含むラッパーを試しましたが、機能します。

これが私の解決策です:

まず、List<Resource<MyPojo>>のラッパークラスを作成します。

public class Bulk<T> {
    private List<Resource<T>> bulk;
    // getter and setter
}

次に、パラメータに@RequestBody Resource<Bulk<MyPojo>>を使用します。

最後に、1つのリクエストでバルクデータを作成するためのリンクを持つjsonの例:

{
    "bulk": [
        {
            "title": "Spring in Action",
            "author": "http://localhost:8080/authors/1"
        },
        {
            "title": "Spring Quick Start",
            "author": "http://localhost:8080/authors/2"
        }
    ]
}
1
totran