JSON API用のSDKを作成していますが、私は一見奇妙な問題に遭遇しています。 APIはPOSTデータの検証が非常に厳密で、id
のようにリソースを更新する際に特定のパラメータが存在することを許可していません。このため、私は@Expose(serialize = false)
私のリソースクラスのIDフィールドを追加しました。しかし、依然としてこのフィールドをシリアライズし、要求が拒否されるようです。次のようにリソースクラスは、おおよそ次のとおりです。Gson:@Expose(serialize = false)を持っていてもパラメータがシリアル化される
public class Organisation extends BaseObject
{
public static final Gson PRETTY_PRINT_JSON = new GsonBuilder()
.setPrettyPrinting()
.create();
@Expose(serialize = false)
@SerializedName("_id")
private String id;
@SerializedName("email")
private String email;
@SerializedName("name")
private String name;
@SerializedName("parent_id")
private String parentId;
public String toJson()
{
return PRETTY_PRINT_JSON.toJson(this);
}
}
私のユニットテストは、クラス・パラメータとしてテストクラスに新しく作成されたインスタンスを保存し、APIを介してOrganisation
のインスタンスを作成して、アップデートをテストしますupdateメソッドを呼び出します新しいリソースを更新してSDKを実装するこれが間違っているところです。 toJson()
メソッドが新しいOrganisation
で呼び出されて、更新要求のためにJSONにシリアル化される場合、_id
フィールドは引き続き存在し、APIが更新を拒否します。テストコードは以下の通りです。コード内のコメントに注目してください。
@Test
public void testCreateUpdateAndDeleteOrganisation() throws RequestException
{
Organisation organisation = new Organisation();
organisation.setParentId(this.ORGANISATION_ID);
organisation.setName("Java Test Organisation");
Organisation newOrganisation = this.MySDK.organisation.create(organisation);
this.testOrganisation(newOrganisation);
this.newOrganisation = newOrganisation;
this.testUpdateOrganisation();
}
public void testUpdateOrganisation() throws RequestException
{
// I tried setting ID to null, but that doesn't work either
// even though I've set Gson to not serialise null values
this.newOrganisation.setId(null);
this.newOrganisation.setName(this.newName);
// For debugging
System.out.println(this.newOrganisation.toJson());
Organisation updatedOrganisation = this.MySDK.organisation.update(this.newOrganisation.getId(), this.newOrganisation);
this.testOrganisation(updatedOrganisation);
assertEquals(newOrganisation.getName(), this.newName);
this.testDeleteOrganisation();
}
誰でも私が間違っていることを発見できますか?私はインスタンスに既にIDの価値があるという事実と関係があると感じていますが、明示的にそれを連載しないように伝えるのは問題ではありませんか?
ご協力いただきありがとうございます。
EDIT:this.MySDK.organisation.update(this.newOrganisation.getId(), this.newOrganisation);
には、組織インスタンスは編集されません。指定されたIDは、SDKがPOSTするURLに単に追加されます(POST /organisation/{id}
)
代わりに 'transient'を試してみてください。 –
@ cricket_007これまでにしたことがありますが、逆シリアル化では無視されます。私は '@ Expose'を使ってそれ以上の制御をしました –
これを見ましたか? https://futurestud.io/tutorials/gson-model-annotations-how-to-ignore-fields-with-expose –