2016-09-29 9 views
2

Springブート(Jacksonを使用)は、JSONドキュメントとJava POJOの間のオブジェクトマッピングを非常にうまく処理します。たとえば:POSTされたJSONとSpringブートのエンティティリレーション

{ id: 5, name: "Christopher" } 

が受け入れられることができます。

@PostMapping("/students/{id}") 
public Student Update(Long studentId, @RequestBody Student student) { 

    studentRepository.save(student); 

    return student; 
} 

と正確にマッピングされます。

public class Student { 
    private Long id; 
    private String name; 
    ... 
} 

しかし、どのようなJSONでネストされたモデルは?

{ id: 5, name: "Christopher", grades: [ {id: 1, letter: 'A'} ] } 

またはJSONのオプションモデルですか?

{ id: 5, name: "Christopher" } 
(Purposefully leaving out 'grades', though it could be accepted.) 

JSONで関連付けが削除されたことを示す(Railsの_destroyフラグを使用した例)か?

{ id: 5, name: "Christopher", grades: [ {id: 1, letter: 'A', _destroy: true} ] } 

IDを省略して関連付けを作成していますか?

{ id: 5, name: "Christopher", grades: [ {letter: 'A-'} ] } 

これらのアイデアをサポートしていますか?

+0

「オプションのモデル」とは何かを言いたい場合は、オプションのとなります。 PojosでOptionalsを使うべきではありません。 –

+0

必ずしもオプションのモデルではなく、JSONに含める必要があるかどうかは任意です。 「Student」に「Grades」のリストがありますが、学生の名前のみを更新したい場合は、毎回、「Grades」配列をPOSTする必要はありません。 – Christopher

+0

データ転送オブジェクト(DTO)を使用して、問題を解決しました。また、シリアル化したくないフィールドに@JsonIgnoreアノテーションを追加することもできます。 –

答えて

1

しかし、JSONのネストされたモデルはどうですか?あなたは多分期待通り

ネストされたモデルは、マッピングされていますが、次のモデルを持っていると仮定します。

public class Product { 
    private String name; 
    private List<Price> prices; 
} 


public class ProductPrice { 
    Long idPrice; 
    Integer amountInCents; 
} 

ジャクソンは、このスキーマから、次のJSONを作成します。

{ 
    "name":"Samsung Galaxy S7", 
    "prices":[ 
     { 
       "idPrice":0, 
       "amountInCents": 100 
     } 
    ] 
} 

かJSONのオプションモデル

@JsonIgnoreでフィールドの注釈を付けることができます。たとえば、@ JsonIgnoreで価格を注釈すると、価格はjacksonからシリアル化されません。

JSONでアソシエーションが削除されたことを示しています( Railsの_destroyフラグを使用しています)。

アソシエーションを削除するための追加のマッピングを作成します。これは、APIは、自己説明する。.. IDを除外することにより

@DeleteMapping("/students/{id}/grade/{idGrade}") 
public Student Update(Long studentId, @PathVariable Long idGrade) { 

    studentService.deleteGrade(studentId,idGrade); 

    return student; 
} 

または関連付けを作成して、別の利点を持っていますか?

私はここにも追加のマッピング作成します。

@PostMapping("/students/{id}/grade") 
public Student Update(Long studentId, @PathVariable String grade) { 

    studentService.addGrade(studentId,grade); 

    return student; 
} 

注:私は直接リポジトリを使用していない、私はサービス層を作成し、すべてのリポジトリは、パッケージ保護されたアクセス権を持っています。サービスレイヤーでは、addGrade、deleteGrad、addStudent、deleteStudentなどのメソッドを作成します。

+0

ありがとう、これはかなり完全な答えです。しかし、データを含めることがあった場合にのみネストされたモデルを直列化したいのですが? @JsonIgnoreは、関連が全く存在しないかのように動作します。しかし、同時にネストされたオブジェクトを持つオブジェクトを作成したい場合や、それを残したい場合があります。この動作はサポートされていますか? – Christopher

+0

私はそれを試したことはありませんが、Jackson JSON Viewsを見てください。私はこれがあなたの目標に合うと思う。ここに素晴らしいブログ記事があります:http://www.baeldung.com/jackson-json-view-annotation –

関連する問題