POJOを使用せずに春の@RequestBody?

theprogrammer:

私は春のブートを使用していると私は私のコントローラで、次のように定義されたメソッドを持っています

@PostMapping("/update)
public void update(@RequestBody User user) {
    ...
}

ただし、クライアントからの私のポストの要求(例えばフロントエンドまたは郵便配達)で、私はこのような何かを持っています:

{
    "firstName" : "John",
    "lastName" : "Doe",
    "id" : 1234,
    "metaInfoId" : "5457sdg26sg4636"
}

事は、私のユーザーPOJOが唯一持っているfirstNameidlastNameit.Howeverでインスタンスフィールドの私の要求I中have to send metaInfoIdにもいくつかの他のニーズに合わせて。だから、どのように私は、取得したり、別のことができますmetaInfoIdし、User上記の私のコントローラメソッドでモデル?

私はと呼ばれる別のモデルクラスを作成する必要がありますUserModelRequestし、すべての追加Userと一緒にフィールドをmetaInfoIdフィールドと、その後使用しますか@RequestBody単純に削除する方法があるmetaInfoId要求から、その後、他のすべてを取り、にそれをダンプするUserPOJOは?あなたは、例えばnodejsで簡単にこれを行うことができます(ちょうどあなたのオブジェクトをスプライスし、あなたが必要なものを取ります)。

だから、別のモデルクラスを作成することなく、Javaの春にそれを行う方法はありますか?

mad_fox:

あなたがあなたのPOJOに注釈を付けることができ@JsonIgnoreProperties(ignoreUnknown = true)、それは無視され含まれないようにフィールドに入力します。

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    private int id;
    private String firstName;
    private String lastName;

    ... getters & setters ...
}

また、あなたはあなたの残りの部分リクエストのボディ内のメタデータを含めるべきではありません。この情報の正しい場所は、ヘッダーにあるであろう。これはにあなたのメソッドのシグネチャを変更します:

@PostMapping("/update)
public void update(@RequestBody User user, @RequestHeader(value="metaInfoId") String metaInfoId) {
    ...
}

あなたがリクエストに情報を追加する必要がある場合は、あなたが(それはmetaInfoIdフィールドを持つクラスを拡張するか、または持っている)、このフィールドを利用できるように、ユーザPOJOクラスを更新する必要があります

最後に、あなたは本当に新しいタイプを作成する必要はありません。あなたは、マップを受け入れるなど、必要な情報を取得するために、署名を変更することができます。

@PostMapping("/update)
public void update(@RequestBody Map<String, Object> userMap) {
    String metaInfoId = userMap.get("metaInfoId");

    ObjectMapper mapper = new ObjectMapper(); // jackson's objectmapper
    final User user = mapper.convertValue(userMap, User.class);
}

おすすめ

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