컨트롤러
의 중요한 역할은 http 요청이 정상적인지 검증검증 실패
)new FieldError(String objectName, String field, String defaultMessage);
new FieldError(String objectName, String field, @Nullable Object
rejectedValue, boolean bindingFailure, @Nullable String[] codes, @Nullable
Object[] arguments, @Nullable String defaultMessage)
new ObjectError(String objectName, String defaultMessage);
new ObjectError(String objectName, @Nullable String[] codes, @Nullable
Object[] arguments, @Nullable String defaultMessage)
검증 실패 시 에러의 데이터와 내용을 보관한는 스프링 객체
컨트롤러
메소드에서 파라미터 위치로 타겟이 되는 @ModelAttribute
바로 뒤에 위치
특정 조건문 안에 FieldError
나 ObjectError
를 .addError()
통하여 등록
.hasError()
를 써서 bindingResult의 에러가 있는지 확인 후 다시 폼페이지를 포워딩하면 에러메세지와 잘못 입력된 값이 담겨서 넘어감@Controller
public String form(
@ModelAttribute("hospital") HospitalForm form,
BindingResult bindingResult
) {
if (필드나 오브젝트의 조건) {
bindingResult.addError(new FieldError("hospital", "hospitalName", form.gethospitalName(), false, null, null, "병원 이름 필드 에러"))
}
}
@ModelAttribue
에 대해 오류를 FieldError, ObjectError 직접 생성하지 않고 관리MessageCodesResolver
가 인식할 에러코드@Controller
public String form(
@ModelAttribute("hospital") HospitalForm form,
BindingResult bindingResult
) {
if (필드나 오브젝트의 조건) {
bindingResult.rejectValue("hospitalName", "NotBlank", null, "공백X");
}
}
DefaultMessageCodesResolver
인 기본 구현체가 보통 사용rejectValue()
, reject()
에서 메세지 코드를 생성required.member.name = 회원 이름 필수
required.name = 이름 필수
required.String = 문자 입력 필수
required = 필수 사항
Validator
를 구현한 클래스를 작성@Component
public class MemberValidator implements Validator {
/* 해당 Validator가 적용가능한 Object인지 판별하기 위함 */
@Override
public boolean supports(Class<?> clazz) {
return Member.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
/* 타겟으로 전달받은 객체 다운캐스팅 */
Member member = (Member) target;
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "itemName", "required");
if (검증조건) {
/*bindingResult는 errors의 자식*/
errors.rejectValue("필드", "에러코드", new Object[]{아규먼트, ...}, null);
}
}
}
@Controller
public class MemberController {
@Autowired
private final MemberValidator memberValidator;
@PostMapping("/member/add")
public String add(@ModelAttribute Member member, BindingResult bindingResult){
//검증 실패 시, 다시 폼으로 포워딩
if (bindingResult.hasErrors()) {
return "member/addForm";
}
//성공했을 떄 로직
retrun "redirect:/member";
}
}
@Validated
를 통해서 실행@Controller
public class MemberController {
@InitBinder
public void init(WebDataBinder dataBinder) {
dataBinder.addValidators(memberValidator);
}
@PostMapping("/member/add")
public String add(@Validated @ModelAttribute Member member, BindingResult bindingResult){
//검증 실패 시, 다시 폼으로 포워딩
if (bindingResult.hasErrors()) {
return "member/addForm";
}
//성공했을 떄 로직
retrun "redirect:/member";
}
}
Bean Validation 2.0(JSR-380)이라는 기술 표준
의존관계 추가
LocalValidatorFactoryBean
을 글로벌 Validaotr로 등록implementation 'org.springframework.boot:spring-boot-starter-validation'
검증 어노테이션을 클래스에 적용 시킴
검증 어노테이션 종류
public class Member {
@NotNull
private Long id;
@NotBlank
private String name;
@Range(min = 1, max = 100)
private int age;
}
typeMismatch
검증 오류 발생NotNull.member.name = 회원 이름 필수
NotNull.name = 이름 필수
NotNull.String = 문자 입력 필수
NotNull = 필수 사항