[SPRING] MultiActionController에서 Spring 유효성 검사를 수행하는 방법은 무엇입니까?
SPRINGMultiActionController에서 Spring 유효성 검사를 수행하는 방법은 무엇입니까?
MultiActionController에서 Spring 유효성 검사를 수행하는 방법은 무엇입니까?
해결법
-
==============================
1.다음 중 하나를 써 보겠습니다.
다음 중 하나를 써 보겠습니다.
public class Person { private String name; private Integer age; public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
그리고 당신의 MultiActionController
import static org.springframework.validation.ValidationUtils.*; @Component public class PersonController extends MultiActionController { public PersonController() { setMethodNameResolver(new InternalPathMethodNameResolver()); setValidators(new Validator[] {new Validator() { public boolean supports(Class clazz) { return clazz.isAssignableFrom(Person.class); } public void validate(Object command, Errors errors) { rejectIfEmpty(errors, "age", "", "Age is required"); rejectIfEmptyOrWhitespace(errors, "name", "", "Name is required"); } }}); } public ModelAndView add(HttpServletRequest request, HttpServletResponse response, Person person) throws Exception { // do something (save our Person object, for instance) return new ModelAndView(); } }
MultiActionController는 MultiActionController에서 사용하는 모든 유효성 검사기를 제공해야하는 validators라는 속성을 정의합니다. 여기에서 MultiActionController 내부에서 Command 객체의 유효성을 확인하는 코드를 볼 수 있습니다.
ServletRequestDataBinder binder = ... if (this.validators != null) for (int i = 0; i < this.validators.length; i++) { if (this.validators[i].supports(command.getClass())) { ValidationUtils.invokeValidator(this.validators[i], command, binder.getBindingResult()); } } } /** * Notice closeNoCatch method */ binder.closeNoCatch();
closeNoCatch 메서드는 말한다.
따라서 Validator가 오류를 반환하면 closeNoCatch는 ServletRequestBindingException을 발생시킵니다. 하지만 다음과 같이 MultiActionController 메서드에서이 메서드를 catch 할 수 있습니다.
public ModelAndView hanldeBindException(HttpServletRequest request, HttpServletResponse response, ServletRequestBindingException bindingException) { // do what you want right here BindException bindException = (BindException) bindingException.getRootCause(); return new ModelAndView("personValidatorView").addAllObjects(bindException.getModel()); }
테스트를 위해서 다음 중 하나를 해봅시다.
@Test public void failureValidation() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.setMethod("POST"); request.setRequestURI("http://127.0.0.1:8080/myContext/person/add.html"); /** * Empty values */ request.addParameter("name", ""); request.addParameter("age", ""); PersonController personController = new PersonController(); ModelAndView mav = personController.handleRequest(request, new MockHttpServletResponse()); BindingResult bindingResult = (BindingResult) mav.getModel().get(BindingResult.MODEL_KEY_PREFIX + "command"); /** * Our Validator rejected 2 Error */ assertTrue(bindingResult.getErrorCount() == 2); for (Object object : bindingResult.getAllErrors()) { if(object instanceof FieldError) { FieldError fieldError = (FieldError) object; System.out.println(fieldError.getField()); } } }
from https://stackoverflow.com/questions/2744587/how-to-perform-spring-validation-in-multiactioncontroller by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 부트 데이터와 MongoDB - 서브 디렉토리 배열 쿼리 필터링 (0) | 2019.04.28 |
---|---|
[SPRING] OpenSessionInViewFilter를 사용할 때 'sessionFactory'라는 bean을 얻지 못했습니다. (0) | 2019.04.28 |
[SPRING] 스프링 배치 프로세서에서 비동기식 REST API 호출하기 (0) | 2019.04.28 |
[SPRING] 동일한 유형의 사용자 정의 리졸버가 추가 될 때 기본 인수 분석기에서 어떤 일이 발생합니까? (0) | 2019.04.28 |
[SPRING] PersistentEntityResourceAssembler를 사용하는 사용자 지정 RepositoryRestController 테스트 (0) | 2019.04.28 |