5

私は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> 
{ 
} 

:この簡単な例を用いて

子コレクションを変更しようとすると、セッターに例外がスローされた場合、唯一のことは思いつきます。

+1

おめでとう、あなたはSDRのメーター深い穴の1つに当たっただけです。 – chrylis

+2

マッピング時に要求からデータが読み取られるのを防ぐことができます。 Jacksonを使用している場合は、@JsonProperty(access = JsonProperty.Access.READ_ONLY)で子コレクションをマークします。したがって、このフィールドは配信のみ許可されますが、更新はされません。 –

+0

@BogdanOrosありがとうございます。これは素晴らしい答えです。 –

答えて

1
@Entity 
public class Customer 
{ 
    private @Id @GeneratedValue(strategy = GenerationType.AUTO) Long id; 

    private String name; 

    private String comment; 

    @JsonProperty(access = JsonProperty.Access.READ_ONLY) 
    @Access(AccessType.PROPERTY) 
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    private Set<Address> addresses = new HashSet<>(); 
} 
+1

もう一度@Bogdan Oros。春データの残りの例の少なくとも1つがこれをカバーしていればうれしいでしょう。それは、集約パターンの適用における主要な考慮事項であるように思われる。 –

関連する問題