5

스프링 데이터 REST/Spring HATEOAS 기반 응용 프로그램을 구축 중이며 여기서 설명한 DDD 원칙을 따르려고합니다 (및 다른 곳에서) : 특히스프링 데이터 나머지 - 총 루트의 하위 엔터티에 PUT/PATCH 업데이트를 방지하는 방법

BRIDGING THE WORLDS OF DDD & REST - Oliver Gierke

단위 및 전용 리소스를 통해 복잡한 상태 변경의 개념.

또한 HTTP 패치를 사용하여 피하거나이 업데이트를 트리거 실제 비즈니스 도메인 이벤트에 대한 많은 정보를 놓치게되기 때문에 비즈니스 도메인의 (복잡한) 상태 전환에 대한 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> 
{ 
} 

이 간단한 예를 사용하여

?

자식 컬렉션을 수정하려는 시도가있는 경우 setter가 예외를 throw하는 경우에만 생각할 수 있습니다.

+1

축하합니다. SDR에서 미터 깊이의 움푹 들어간 곳 중 하나에 충돌했습니다. – 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. 스프링 데이터 나머지 예제 중 적어도 하나가이를 다룬다면 좋을 것입니다. 그것은 집합 패턴의 적용에서 주요한 고려 사항 인 것처럼 보인다. –

관련 문제