반응형

@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값을 받을 경우

      Screen Shot 2020-02-04 at 10 03 04 PM

      id값이 정상적으로 넘어오는 것을 확인할 수 있다.


    • webDataBinder.setDisallowedFields("id"); 설정을 해줄 경우

      Screen Shot 2020-02-04 at 10 03 41 PM

      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";
      }

    • 실행의 예

      Screen Shot 2020-02-04 at 10 12 22 PM
반응형

BELATED ARTICLES

more