반응형
@InitBinder
특정 컨트롤러에서 바인딩 또는 검증 설정을 변경하고 싶을 때 @InitBinder를 이용해 설정값을 지정할 수 있다.
사용법
@InitBinder public void initEventBinder(WebDataBinder webDataBinder) { ... (설정) } // 특정 모델 객체에만 적용을 하고 싶을 경우 아래와 같이 이름을 지정. @InitBinder("event") public void initEventBinder(WebDataBinder webDataBinder) { ... (설정) }
바인딩 설정
@InitBinder public void initEventBinder(WebDataBinder webDataBinder) { webDataBinder.setDisallowedFields("id"); // 또는 // webDataBinder.setAllowedFields(); }
setDisallowedFields()
: 지정한 값을 제외하고 바인딩을 한다.setAlloewdFields()
: 지정한 값들만 바인딩 한다.
예)
id
값을 바인딩 하고 안하기아무 설정을 하지 않고 id값을 받을 경우
id값이 정상적으로 넘어오는 것을 확인할 수 있다.
webDataBinder.setDisallowedFields("id");
설정을 해줄 경우Id값에
null
값으로 바인딩이 되지 않는 것을 확인할 수 있다.
Formatter 설정
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) private LocalDate startDate;
- 위의 코드와 같이 포매터를
Event
라는 클래스에서 startDate라는 포맷을 지정해줄 수도 있고 webDataBinder.addCustomFormatter();
를 사용하여 설정해줄 수도 있다.
- 위의 코드와 같이 포매터를
Validator 설정
첫번째 방법
EventValidator
라는 클래스를 다음과 같이 만들어준다.
public class EventValidator implements Validator { @Override public boolean supports(Class<?> aClass) { return Event.class.isAssignableFrom(aClass); } @Override public void validate(Object o, Errors errors) { Event event = (Event)o; // name값이 "aaa"이면 에러를 발생 if (event.getName().equalsIgnoreCase("aaa")) { errors.rejectValue("name", "wrongValue","the value is not allowed"); } } }
- 컨트롤러의 @InitBinder에
addValidators()
를 사용하여 validator를 추가해준다.
@InitBinder("event") public void initEventBinder(WebDataBinder webDataBinder) { webDataBinder.addValidators(new EventValidator()); }
두번째 방법
EventValidator
라는 클래스 @Component를 사용하여 빈으로 등록해준다.
@Component public class EventValidator { public void validate(Event event, Errors errors) { if (event.getName().equalsIgnoreCase("aaa")) { errors.rejectValue("name", "wrongValue","the value is not allowed"); } } }
- 컨트롤러에서 의존성 주입을 받고 특정시점에서 validator를 사용한다.
@Autowired EventValidator eventValidator; ... @PostMapping("/events/form/name") public String eventsFormNameSubmit(@Validated @ModelAttribute Event event, BindingResult bindingResult) { if(bindingResult.hasErrors()) { return "/events/form-name"; } // validator 실행 eventValidator.validate(event, bindingResult); return "redirect:/events/form/limit"; }
실행의 예
반응형
'Web > Spring' 카테고리의 다른 글
[Spring MVC] @ControllerAdvice로 전역 컨트롤러 만들기 (0) | 2020.02.05 |
---|---|
[Spring MVC] @ExceptionHandler 사용하기 (0) | 2020.02.04 |
[Spring MVC] @ModelAttribute의 또 다른 사용 (0) | 2020.02.04 |
[Spring MVC] @ResponseBody와 ResponseEntity (0) | 2020.01.24 |
[Spring MVC] @RequestBody와 HttpEntity 사용하기 (0) | 2020.01.23 |