DTO를 받아 Builder를 통해 Entity로 변환하는 과정에서 컬렉션들이 null로 세팅되는 것을 발견하였다.
대부분의 경우 컬렉션에 명시적초기화와 함께 final을 붙여주었지만, 이번엔 그렇지 않은 경우였다.
@Builder ...
public class TestEntity {
private Set<Account> testers = new HashSet<>();
TestEntity test = TestEntity.builder().build();
test.testers.add(account1);
이유는 아래와 같다.
Lombok @Builder not initializing collections
롬복 개발자의 답변
Only when you use @Singular
, you get an empty list. On the Builder documentation page it says:
…with the @Singular annotation, lombok will treat that builder node as a collection.
Without the @Singular
, lombok treats it as any other object. So it will be null
instead of an empty Collection.
이런 경우엔
final
을 붙여준다. (아래 테스트 2)@Builder.default
어노테이션을 붙여준다. (아래 테스트 3, 4)TestEntity test = TestEntity.builder().testers(new HashSet<>()).build();
@Builder ...
public class TestEntity {
...
// 1 : null
private Set<Account> tester1 = new HashSet<>();
// 2 : 초기화 o
private final Set<Account> tester2 = new HashSet<>();
// 3 : 초기화 o
@Builder.Default
private Set<Account> tester3 = new HashSet<>();
// 4 : 초기화 o
@Builder.Default
private final Set<Account> tester4 = new HashSet<>();
// 5 : 오류 발생 @Builder.Default를 쓰기 위해서는 반드시 초기화 할 기본 값을 주어야한다.
@Builder.Default
private final Set<Account> tester4;
Stackoverflow : Lombok @Builder not initializing collections
Lombok Docs : @Builder