私はSpring Data REST/Spring HATEOASベースのアプリケーションを構築しています。ここで説明したDDDの原則に従っています。 :特にSpring Data Rest - 集合ルートの子エンティティへのPUT/PATCHの更新を防ぐ方法
BRIDGING THE WORLDS OF DDD & REST - Oliver Gierke
凝集体および専用のリソースを経由して、複雑な状態変化の概念。
また、この更新を引き起こした実際のビジネスドメインのイベントに関する多くの情報が不足しているため、ビジネスドメインの(複雑な)状態遷移にHTTP PATCHまたはPUTを使用しないでください。たとえば、顧客の郵送先アドレスを変更すると、新しい「ChangeOfAddress」リソースへのPOSTであり、別の郵送先フィールド値を持つ「Customer」リソースのPATCHまたはPUTではありません。
私が苦労しているのは、これを強制して、集約ルートに美容的な変更を可能にする手段です。化粧品の変化(例えば更新コメント)が、利用を許可するが、直接の子コレクションを更新し、変更を防止するための最良の/正しい方法は何ですか
@Entity
public class Customer
{
private @Id @GeneratedValue(strategy = GenerationType.AUTO) Long id;
private String name;
private String comment;
@Access(AccessType.PROPERTY)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Address> addresses = new HashSet<>();
... getters and setters
public void addAddress(Address address)
{
addresses.add(address);
... custom code to raise events etc
}
}
public interface Customer extends CrudRepository<Customer, Long>
{
}
:この簡単な例を用いて
?
子コレクションを変更しようとすると、セッターに例外がスローされた場合、唯一のことは思いつきます。
おめでとう、あなたはSDRのメーター深い穴の1つに当たっただけです。 – chrylis
マッピング時に要求からデータが読み取られるのを防ぐことができます。 Jacksonを使用している場合は、@JsonProperty(access = JsonProperty.Access.READ_ONLY)で子コレクションをマークします。したがって、このフィールドは配信のみ許可されますが、更新はされません。 –
@BogdanOrosありがとうございます。これは素晴らしい答えです。 –