リソースを管理するためのREST APIを作成しています。我々はJersey
フレームワークを使用しています。続き入力に意図的に 'null'が設定されているかどうかを確認するJSON
はJSONは以下のクラスにマップする必要がありJSON
cable {
"id": 1,
"name": "Cable 1",
"description": "Test Cable",
"Site": 4
}
の構造です。
public class CableDTO {
private Long id;
private String name;
private String description;
//private SiteDTO site;
private Long siteID;
.
.
.
// Getters ans Setters
}
サイトは実際には参照オブジェクトです。入力と出力のJSONでは、にSite
オブジェクトの代わりにサイトIDが含まれている必要があります。我々はのアセンブラを持っています。このアセンブラは、DTOをドメインオブジェクトに変換します。逆もまた同様です。
サンプルアセンブラコードは以下の通りです:
public class CableAssembler {
//some code
public void fillDomain(Cable cable, CableDto dto){
if(dto.getId() != null) cable.setID(dto.getId());
if(dto.getSiteID() != null) cable.setSiteId(dto.getSiteId())
//some more code below
}
}
ブランドの新しいPOST HTTPメソッドが呼び出されたときに、このアセンブラはうまく動作します。 SiteID
が入力jsonに設定されていない場合、サイトはnullに設定され、すべてが大変です。ただし、PUT HTTPコールでは、SiteID
が設定されていない場合、既存のSiteID
は、null
に上書きされます。これは、PUT呼び出しとPOST呼び出しの両方で同じアセンブラが使用されるためです。アセンブラは、DTOに設定されたsiteIDがnull
かどうかをチェックします。 null
の場合は、既存のsiteID
が上書きされます。問題は、私はSiteID
でnull
値は、値が送信されていなかったためであるかSiteID
が実際に意図的null
に設定したかどうかを区別することはできませんよ、である(可能である{"siteID":null}
)
解決する方法上の任意のポインタこの?
シリアル化/逆シリアル化にはJackson
を使用します。
Thnx @mortalis。複雑な世界の図書館では、単純なことを忘れることもあります。私は、JSONライブラリのアノテーションがいくつかのオートグラフ機能を助け、実行する方法があるとの意見でした。しかし、ブール値を設定するという考えは、シンプルで洗練されたソリューションです。 thnx。 –