2017-07-06 4 views
1

私はJax-RSとJooqを使用しています。 スパースデータを使用してREST PATCHを実装する方法を知りたいと思います。JOOqスパースアップデート

私はいくつかのPoJoを持っているとしましょう。 JSON PATCH(http://www.restapitutorial.com/lessons/httpmethods.html)リクエストで、不完全なオブジェクトがリクエストされ、変更されるはずのフィールドのみが含まれています。

どうすればこのようなハンドラを作成できますか?

私は実際のPojoオブジェクトを受け入れようとしました。私の最初の考えは「フィールドがnullの場合は更新しません」でした。これが私の最初の問題でした。

public Resource update(@PathParam("id") UUID id, Resource resource) { 
    ResourceRecord record = dslContext.newRecord(RESOURCE, resource); 
    dslContext.update(RESOURCE).set(resource).where(RESOURCE.ID.eq(id)).execute(); 

    // or 

    memberDao.update(member); 

    return resourceDao.findById(id); 
} 

私は事を試してオンラインで検索しているうちに、「意図的に何かをnullに設定するのはどうですか?」と考えました。したがって、要求のフィールドの存在に依存しなければなりません。

私の最後のアイデアは:動作しません

public Resource update(@PathParam("id") UUID id, Map<String, Object> changes) { 
    dslContext.update(RESOURCE).set(changes).where(RESOURCE.ID.eq(id)).execute(); 
    return resourceDao.findById(id); 
} 

、もちろん(セット(地図<フィールド、...>))で。

しかし、私はちょっと固まっていて、インターウェブはさまざまな問題の答えがいっぱいでしたが、誰かが同じことを試したことはありませんでした。

私の心の中で私は何らかの畏敬の念を感じる反射とループで遊んでいました。できるだけ簡単にコードを書く方法を知りたいです。

+0

を呼ぶであろう、DSLContext.newRecord(Table, Object)にマップを渡すことができます構造体)がクライアントからDBにチェックされません。これはセキュリティ上の脆弱性です。攻撃者はプライベートDBフィールドを推測して変更することができます(例:admin = true)。 – jhyot

答えて

0

私は実際のPojoオブジェクトを受け入れようとしました。私の最初の考えは「フィールドがnullの場合は更新しません」でした。これが私の最初の問題でした。

これは、jOOQの動作ではありません。 The rationale is described in this blog post here。特に、ここではコードの特定の行:

ResourceRecord record = dslContext.newRecord(RESOURCE, resource); 

は(その値はPOJOからそれらを設定することによって変更されているかどうかに関係なく、そう)彼らはnullかそうでないかどうかに関係なく、trueにすべてResourceRecord.changed()のフラグを設定します。 RESTに関しては、これはPUTに相当し、PATCHよりはるかに多くなります。

これははるかに優れています:

public Resource update(@PathParam("id") UUID id, Map<String, Object> changes) { 
    dslContext.update(RESOURCE) 
       .set(translate(RESOURCE, changes)) 
       .where(RESOURCE.ID.eq(id)) 
       .execute(); 
    return resourceDao.findById(id); 
} 

あなたはRESOURCEでフィールド名を探して、あなたのMap<String, Object>Map<Field<?>, Object>に変換translate()機能が必要になります。

これは、もちろん、残りのAPIとは矛盾しています。修正プログラムが道を進んでいる。一方https://github.com/jOOQ/jOOQ/issues/6388

、あなただけちょうどあなたが `Map`(またはいずれかのデータを渡さないことを確認して、内部Record.fromMap()