私のプロジェクトでは、Jersey 2.23.1をJSONサポート用にジャクソンと共に使用しています。Jersey + Jacksonはデシリアライズ時にnullを取り除きます
{"foo":null、 "bar": "123"}のようなリクエストをJSONとして取得したとき、クラスAと一致する{String foo; String bar;} JerseyはまずAのインスタンスを作成し(コンストラクタで指定されている場合はデフォルト値で)、JSONを一時オブジェクトA 'に逆シリアル化し、JSONで指定されたすべてのJSONフィールドをA'からAにコピーします。 Aクラスのコンストラクタのデフォルト値で、JSONのフィールドがnullの場合、すべてのデフォルト値が消去され、nullに置き換えられます(前の例では、 "foo"フィールドのデフォルト値がある場合、オブジェクトのnullによって、Jerseyは@Path Annotedメソッドのparamとして返されます)。
Response中にnull filedsの転送を避けるために、Aクラスに@JsonInclude(Include.NON_NULL)を使用しています。しかし、それは直列化のためにのみ動作します、逆直列化についてはどうですか?つまり、JSONの結果としてフィールドが "foo" = nullになり、デシリアライズ後に新しいオブジェクトインスタンスに{"foo":null}があるとします。ここで
本のすべて合計するいくつかのコードです:私はJSON
(コントローラで)私の方法に { "id":null, "lastName":null, "firstName":"Random First Name", "role":"STUDENT" }
のこの種を渡している場合、 `
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(value = Include.NON_NULL)
public class User {
public enum EUserRole {
PARENT, STUDENT, PROF, ADMIN
}
@Id
public String id;
public String firstName;
public String lastName;
public EUserRole role;
public User() {
id = ObjectId.get().toString();
role = EUserRole.STUDENT;
lastName = "RandomLastName";
}
}
` を
@POST public Response createUser(final User entity) { }
これは、JSONのすべてのnullフィールドが自分のエンティティでnullに設定され、コンストラクタのデフォルト値に設定されないという結果に終ります。
デシリアライズ時にnullフィールドを無視するようにジャクソンを指定する方法があるかどうか知っていますか?それともジャージー関連の行動ですか?含まれている値に基づいて、その意味でJSONペイロードからのデータを無視する方法はありません