0

私の理解では、Jackson によってオブジェクトがアンマーシャリングされると、リクエスト呼び出しで言及されていないフィールドはデフォルト値 (オブジェクトの場合は null) に設定され、その特定のフィールドに制約がある場合 (@NotNull など)、検証は失敗します。 . したがって、部分的な更新はできません。

これに対する最善の回避策を知っている人はいますか (REST の部分的な更新)。誰かが前にそのようなことを実装しましたか?

私の推測では、元のオブジェクト (db から) と新しいマーシャリングされていないオブジェクトのマージが発生する必要があり、その後、オブジェクトが検証されるはずですが、実際にこれを実装する方法がわかりません。他のアイデアをいただければ幸いです。

Spring 3.1.2 と Jackson 1.9.7 を使用しています。

4

1 に答える 1

0

イントロスペクションを使用して、マーシャリングされていないオブジェクトをデータベース内の既存のオブジェクトとマージできます。

import java.beans.Introspector;
...

Class<?> entityClass = YourEntity.class

// oldEntity is from database
oldEntity = entityManager.getReference(entityclass, id);

for (PropertyDescriptor property : Introspector.getBeanInfo(entityClass).getPropertyDescriptors()) {
    if (property.getReadMethod() != null && property.getWriteMethod() != null) {

        // You retrieve the value of the current property of your unmarshalled entity
        Object newValue = property.getReadMethod().invoke(unmarshalledEntity);

        if (value != null) {
            property.getWriteMethod().invoke(oldEntity, newValue);
        }
    }
}

ただし、このソリューションでは、フィールドを次のように更新することはできませんnull...問題になる可能性があります。そして、これは単なるアイデアです。タイプに注意する必要がvalueあります。別のBeanである可能性があるため、データを再帰的にイントロスペクトする必要があります。

于 2012-10-10T12:02:00.083 に答える