Spring Bean Validation Priority | JeongKeepsCalm

Spring Bean Validation Priority

Interfaces In Class

1
2
3
4
5
6
7
8
public class ValidationGroups {

  public interface First{};
  public interface Second{};
  public interface Third{};
  public interface Forth{};

}


@GroupSequence

1
2
3
4
5
@GroupSequence({ValidationGroups.First.class
        , ValidationGroups.Second.class
        , ValidationGroups.Third.class
        , ValidationGroups.Forth.class})
public interface ValidationSequence {}


Request Object

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Data
public class PriorityRequest {

  @Builder
  @JsonCreator 
  public PriorityRequest(String email) {
    this.email = email;
  }

  @NotBlank(groups = ValidationGroups.Second.class, message = "빈문자 허용 x")
  @Email(groups = ValidationGroups.Third.class,
          regexp = "[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,3}", message = "이메일 형식에 맞게 입력")
  @Size(groups = ValidationGroups.First.class,
          min = 3, max = 10, message = "3 ~ 10 문자")
  private String email;

}

@NotBlank: 빈문자 & 공백 & null 허용하지 않는다.
@JsonCreator/@JsonProperty:
@Builder를 사용할 때는 Jackson이 객체를 생성하기 위한 충분한 정보를 가지고 있지 않음. 따라서, Jackson이 객체를 올바르게 생성할 수 있도록 도와주는 추가 설정이 필요하다.
역직렬화 생성자를 명시적으로 정의. @Builder 어노테이션과 함께 사용할 때 유용


Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RestController
@Slf4j
public class PriorityController {

  @PostMapping("/test")
  public Object priorityTest(@Validated(ValidationSequence.class) @RequestBody PriorityRequest priorityRequest, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
      return bindingResult.getAllErrors()
              .stream()
              .map(v -> v.getDefaultMessage())
              .collect(Collectors.toList());
    }
    return "no error";
  }

}

@Validated(ValidationSequence.clas): 시퀀스 정의된 클래스 명시