私は春のブートを使用していると私は私のコントローラで、次のように定義されたメソッドを持っています
@PostMapping("/update)
public void update(@RequestBody User user) {
...
}
ただし、クライアントからの私のポストの要求(例えばフロントエンドまたは郵便配達)で、私はこのような何かを持っています:
{
"firstName" : "John",
"lastName" : "Doe",
"id" : 1234,
"metaInfoId" : "5457sdg26sg4636"
}
事は、私のユーザーPOJOが唯一持っているfirstName
、id
とlastName
it.Howeverでインスタンスフィールドの私の要求I中have to send
metaInfoId
にもいくつかの他のニーズに合わせて。だから、どのように私は、取得したり、別のことができますmetaInfoId
し、User
上記の私のコントローラメソッドでモデル?
私はと呼ばれる別のモデルクラスを作成する必要がありますUserModelRequest
し、すべての追加User
と一緒にフィールドをmetaInfoId
フィールドと、その後使用しますか@RequestBody
?単純に削除する方法があるmetaInfoId
要求から、その後、他のすべてを取り、にそれをダンプするUser
POJOは?あなたは、例えばnodejsで簡単にこれを行うことができます(ちょうどあなたのオブジェクトをスプライスし、あなたが必要なものを取ります)。
だから、別のモデルクラスを作成することなく、Javaの春にそれを行う方法はありますか?
あなたがあなたの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);
}