Just Do IT!
[Spring] @Builder will ignore the initializing expression entirely. 해결 본문
개발 공부/Error
[Spring] @Builder will ignore the initializing expression entirely. 해결
MOON달 2024. 9. 11. 16:28728x90
반응형
@Builder will ignore the initializing expression entirely.
If you want the initializing expression to serve as default, add @Builder.Default.
If it is not supposed to be settable during building, make the field final.
실습을 하면서 User entity를 생성하는데, 이러한 warning이 뜨고 있었다.
생성자를 사용하여 초기화하는 방법 대신에 lombok 어노테이션 중 하나인 @Builder를 사용했는데 이것 때문에 오류가 난 것이었다.
그렇지만 아래 if문을 읽으면 해결방법을 알 수 있다.
☞ @Build.Default를 사용하거나 final을 붙이면 해결 된다.
내가 작성한 코드는
@Entity
@EntityListeners(AuditingEntityListener.class)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(updatable = false)
private Long id;
@Column(nullable = false, unique = true)
private String email;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String password;
@CreatedDate
@Column(name = "created_at")
private LocalDateTime createdAt;
@LastModifiedDate
@Column(name = "updated_at")
private LocalDateTime updatedAt;
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private RoleEnum role = RoleEnum.ROLE_USER;
@Column(name = "refresh_token")
private String refreshToken;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
// 권한 목록 반환
return List.of(new SimpleGrantedAuthority(role.name()));
}
@Override
public String getUsername() {
// 로그인할 사용자 명시
return email;
}
}
이런 형식이었는데 role의 default를 user로 지정하자 생긴 에러였다.
그래서 초기화를 원하는 필드에다 @Builder.Default를 붙여주었다.
@Column(nullable = false)
@Enumerated(EnumType.STRING)
@Builder.Default
private RoleEnum role = RoleEnum.ROLE_USER;
이렇게 수정하고 나니 경고문은 사라졌다.
@Default 애노테이션을 가진 필드는
반드시 초기화 식을 가져야 하고, building 과정 시에 초기화되지 않으면 식대로 초기화된다는 뜻이다.
@Builder는 해당 클래스의 별도의 static 내부 클래스를 만들어서 빌더 패턴을 구현하는데,
이 내부 클래스는 원래 클래스의 필드 초기화식에 접근할 수 없기 때문에 생기는 경고문이었다.
간단히 구글링으로 해결했는데, 나중에 똑같은 경고문을 만날까봐 작성해둔다.
728x90