@InitBinder
: 특정 컨트롤러에서 바인딩 또는 검증 설정을 변경하고 싶을 때 사용
사용법)
바인딩 설정
: webDataBinder.setDisallowedFields();
포메터 설정
: webDataBinder.addCustomFormatter();
Validator 설정
: webDataBinder.addValidators();
특정 모델 객체에만 바인딩 또는 Validator 설정을 적용하고 싶은 경우
: @InitBinder("event")
package com.example.demo;
import java.util.Set;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
public class EventValidator implements Validator{
@Override
public boolean supports(Class<?> clazz) {
return Event.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
Event event = (Event)target;
if(event.getName().equalsIgnoreCase("aaa")) {
errors.rejectValue("name", "wrongValue","defaultMessge");
}
}
}
package com.example.demo;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttribute;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
@Controller
@SessionAttributes("event")
public class EventController {
@InitBinder
public void initBinder(WebDataBinder webDataBinder) {
webDataBinder.setDisallowedFields("id"); //받고 싶지 않은 필드를 설정할수있다.
webDataBinder.addValidators(new EventValidator());
}
@InitBinder("event")
public void initEventBinder(WebDataBinder webDataBinder) {
webDataBinder.setDisallowedFields("id"); //받고 싶지 않은 필드를 설정할수있다.
webDataBinder.addValidators(new EventValidator());
}
@GetMapping("/events/form/name")
public String eventFormName(Model model) {
model.addAttribute("event", new Event());
return "/events/form-name";
}
@PostMapping("/events/form/name")
public String eventsFromNameSubmit(@Validated @ModelAttribute Event event, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "/events/form-name";
}
return "redirect:/events/form/limit";
}
}
위의 코드를 보면 @InitBinder 어노테이션을 붙여준 메소드가 두개가 있습니다.
기본적으로 @InitBinder만을 사용하게 되면 모든 바인딩에 대해서 적용이 되지만
@InitBinder("event")를 하게 되면 특정 객체(값)에 바인딩에 대해서만 적용이 된다.
위의 코드는 id의 필드값은 무시하고 Validator를 하겠다.
name에 aaa를 입력하였더니 errorCode를 배출하게 됩니다.
물론 html에서 error를 받았을때 처리하는 작업을 해야지만 보여지게 됩니다.
'Spring > SpringMVC' 카테고리의 다른 글
[Spring MVC] @ControllerAdvice (0) | 2019.08.24 |
---|---|
[Spring MVC] @ExceptionHandler (0) | 2019.08.24 |
[Spring MVC] @ModelAttribute 와 Model (0) | 2019.08.23 |
[Spring MVC] 응답 타입 @ResponseBody & ResponseEntity (0) | 2019.08.22 |
[Spring MVC] MultipartFile (0) | 2019.08.20 |