2016-05-11 3 views
2

フロントエンドからdelta jsonを受け取るHTTP PUTエンドポイントをJavaで作成しようとしていますが、「nulls」を実装する方法を理解する上で問題があります。例えば空のJSON対nullへの変換

我々は

id : 1 
firstname : Luke 
lastname : Xu 
age : 24 
fav_color : Red 

のように見え、我々は{age : 25}のJSONでPUT request to /person/1を介して送信データベースモデルを持っている場合。現在、JSONを次のJSONに変換するJOOQ pojoがJavaモデルになっていますが、問題はデータベースの値をnullに更新することです。

それは私のJavaエンドポイントにヒットするとJavaのモデルは単に「ヌル」に両方のケースを設定し、nullを渡されたの間に違いはありません

{age : 25} 

{id : 1, 
firstname : null, 
lastname : null, 
age : 25, 
fav_color : null} 

の間に違いはありませんまたは値がまったく渡されていないことを示します。

私は入力ストリーム(JSON型)を処理することも考えましたが、この問題は、私たちのJSON名が、まったく不合理な種類のデータベース列名と同じ名前にする必要があるということです。

"delta json"のみを送信する場合は、データベースを編集するための標準は何ですか?

+0

に私はそれはあなたが使用してJSONの構文解析ライブラリーのための具体的な質問だと信じています。私はあなたのデータモデルにJSONを組み込む何らかのORMを使用すると思います。それは、「値なし」と「値がヌル」の区別をサポートするかどうかをサポートします。私が見たJSON解析ライブラリには、null値のための特別な値(JsonNullなど)がありました。解析には何を使用しますか? – yeputons

+0

DTOを使用してデータベースエンティティオブジェクトを取得し、それをDTOデータで更新することができます。 DTOはかなり一般的な方法です。しかし、一般的にPUTを使用すると、すべてのフィールドがリクエストJSONに含まれている必要があります。 PUTは一般に_complete_アップデートです。部分的な更新はPATCHで行います。 –

答えて

1

あなたがjOOQを使っているので、私はあなたが直接、実際に区別することができますjOOQ UpdatableRecordにJSON値を渡すことをお勧めしたい:初期化(またはdefault)ではないという意味

  • null
  • これは、個々の列のchanged()フラグを維持することによって、そうnull

を意味null。例えば

{age : 25} 

が...このJavaコードに変換します。

// record.set(USER.ID, 1) I suspect this is still necessary...? 
record.set(USER.AGE, 25); 
record.update(); 

...と、このSQL文へ:

UPDATE users 
SET age = 25 
WHERE id = 1 

のに対し、
{id : 1, 
firstname : null, 
lastname : null, 
age : 25, 
fav_color : null} 

が...このJavaコード

record.set(USER.ID, 1); 
record.set(USER.FIRSTNAME, null); 
record.set(USER.LASTNAME, null); 
record.set(USER.AGE, 25); 
record.set(USER.FAV_COLOR, null); 

に変換...と、このSQL文

UPDATE users 
SET firstname = null, 
    lastname = null, 
    age = 25, 
    fav_color = null 
WHERE id = 1