callofdutyops:
春には、私は、PATCHリクエストを処理するために、このようなコードを記述します。
@PatchMapping(path="/{orderId}", consumes="application/json")
public Order patchOrder(@PathVariable("orderId") Long orderId, @RequestBody Order patch) {
Order order = repo.findById(orderId).get();
if (patch.getDeliveryName() != null) {
order.setDeliveryName(patch.getDeliveryName());
}
if (patch.getDeliveryStreet() != null) {
order.setDeliveryStreet(patch.getDeliveryStreet());
}
if (patch.getDeliveryCity() != null) {
order.setDeliveryCity(patch.getDeliveryCity());
}
//...
//Check all fields in Order class.
return repo.save(order);
}
もちろん、ここで少なくとも2つの欠点があります:
- コードがあるため、ヌルチェックのロットのきれいではありません。
- でも、関数にはnullチェックを抽象化した場合、我々はの定義変更したときに、まだ問題がそこにいる
Order
クラスを。フィールドを削除するかで新しいフィールド追加するときすなわち、あるOrder
クラスを、このコードの塊も書き直さなければなりません。
私はPATCHを行うためにのみNULL以外のフィールドを送信するようにクライアント側でいくつかのヌルチェックを行うことができます知っているが、これを行うためのエレガントな方法があります場合、私は思ったんだけど?オブジェクトマッピングまたはいくつかの他の方法と同様?
Parth Kansara:
以下ようにだけヌルをチェック最初最初代わりの:
if (patch.getDeliveryName() != null) {
order.setDeliveryName(patch.getDeliveryName());
}
あなたはそれを1行にすることができます。
order.setDeliveryName(StringUtils.isEmpty(patch.getDeliveryName()) ? "" : patch.getDeliveryName());
またヌルと空の値のためのスプリング提供方法チェックを使用。
そして、ポイントの「B」あなたは、コードの下に使用することができます:
BeanUtils.copyProperties(bean2, bean1);
pom.xmlに以下の依存関係を追加
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>