2017-03-27 3 views
0

リソースを管理するための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が上書きされます。問題は、私はSiteIDnull値は、値が送信されていなかったためであるかSiteIDが実際に意図的nullに設定したかどうかを区別することはできませんよ、である(可能である{"siteID":null}

解決する方法上の任意のポインタこの?
シリアル化/逆シリアル化にはJacksonを使用します。

答えて

1

私は右のあなたの状況を理解している場合、私の提案は以下のとおりです。

  • あなたは、siteIDを設定して送信された場合はJSONとDTOを伝えるにbooleanフィールドを追加し、アセンブラや他のコードでそれを確認することができた場合;
  • -10のような別のデフォルト値をnullとしてください(可能な場合)。
+0

Thnx @mortalis。複雑な世界の図書館では、単純なことを忘れることもあります。私は、JSONライブラリのアノテーションがいくつかのオートグラフ機能を助け、実行する方法があるとの意見でした。しかし、ブール値を設定するという考えは、シンプルで洗練されたソリューションです。 thnx。 –

1

PATCHリクエストのようにPUTリクエストを使用しているようです。 PUTリクエストを正しく使用するには、ケーブル情報を取得し、いくつかのフィールドを変更してPUTを戻す必要があります。この場合、siteIdフィールドは変更されません。

+0

PUT/PATCH/POSTは、すべて同じアセンブラを使用します。要は、誰かがサイトからケーブルを切り離したい場合、{"siteID":null}を送ることができます。 siteIDが送信されたかどうかを確認するにはどうすればよいですか。例えば、入力されたjsonは{description}: "changed desc"}ですが、どちらの場合もsiteIDはnullになります。後者の場合、siteIDはケーブルから切り離すべきではありません。 –

+0

これは、エンティティの一部だけを変更したい場合は、PATCHメソッドが優先される理由です。 PATCHの{"description": "changed desc"}はsiteIdを上書きしません。PUTの場合は、{"description": "changed desc"、 "siteId": "currentSiteId"、...}のように、既存のsiteId値(他の値と同様に)を指定する必要があります。 –

関連する問題