Spring MVC를 사용하면 주석을 사용하거나 수동으로 사용하거나 두 가지를 혼합하여 유효성 검사를 수행하는 세 가지 방법이 있습니다. 검증 할 수있는 독창적 인 "깨끗하고 최상의 방법"은 없지만 프로젝트 / 문제 / 문맥에 더 잘 맞는 방법이있을 것입니다.
사용자를 갖자 :
public class User {
private String name;
...
}
방법 1 : Spring 3.x +를 사용하고 간단한 유효성 검사를 수행하는 경우 javax.validation.constraints
주석 (JSR-303 주석이라고도 함)을 사용하십시오.
public class User {
@NotNull
private String name;
...
}
참조 구현 인 Hibernate Validator 와 같은 라이브러리에 JSR-303 공급자가 필요합니다 (이 라이브러리는 데이터베이스 및 관계형 매핑과 관련이 없으며 유효성 검사 만 수행합니다 :-).
그런 다음 컨트롤러에 다음과 같은 것이 있습니다.
@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @Valid @ModelAttribute("user") User user, BindingResult result){
if (result.hasErrors()){
// do something
}
else {
// do something else
}
}
@Valid : 사용자가 null 이름을 가지면 result.hasErrors ()는 true입니다.
방법 2 : 복잡한 유효성 검사 (큰 비즈니스 유효성 검사 논리, 여러 필드의 조건부 유효성 검사 등)가 있거나 어떤 이유로 든 방법 1을 사용할 수없는 경우 수동 유효성 검사를 사용하십시오. 컨트롤러 코드와 유효성 검사 논리를 분리하는 것이 좋습니다. Spring은 검증 클래스를 처음부터 작성하지 마십시오. Spring은 org.springframework.validation.Validator
Spring 2부터 편리한 인터페이스를 제공합니다 .
그래서 당신이 있다고 가정 해 봅시다
public class User {
private String name;
private Integer birthYear;
private User responsibleUser;
...
}
사용자의 연령이 18 세 미만인 경우 책임 사용자는 null이 아니고 책임 사용자의 나이는 21 세 이상이어야합니다.
당신은 이런 식으로 할 것입니다
public class UserValidator implements Validator {
@Override
public boolean supports(Class clazz) {
return User.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
User user = (User) target;
if(user.getName() == null) {
errors.rejectValue("name", "your_error_code");
}
// do "complex" validation here
}
}
그런 다음 컨트롤러에 다음이 있습니다.
@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @ModelAttribute("user") User user, BindingResult result){
UserValidator userValidator = new UserValidator();
userValidator.validate(user, result);
if (result.hasErrors()){
// do something
}
else {
// do something else
}
}
유효성 검사 오류가있는 경우 result.hasErrors ()는 true입니다.
참고 : "binder.setValidator (...)"를 사용하여 컨트롤러의 @InitBinder 메소드에서 유효성 검사기를 설정할 수도 있습니다 (이 경우 기본값을 바꾸므로 메소드 1과 2를 혼합하여 사용할 수 없음) 유효성 검사기). 또는 컨트롤러의 기본 생성자에서 인스턴스를 생성 할 수 있습니다. 또는 컨트롤러에 @Autowired를 주입하는 @ Component / @ Service UserValidator를 사용하십시오. 대부분의 유효성 검사기는 싱글 톤 + 단위 테스트 조롱이 쉬워지고 유효성 검사기는 다른 Spring 구성 요소를 호출 할 수 있기 때문에 매우 유용합니다.
방법 3 :
두 방법을 함께 사용하지 않는 이유는 무엇입니까? 주석을 사용하여 "name"속성과 같은 간단한 항목의 유효성을 검사하십시오 (빠르고 간결하며 읽기 쉽습니다). 사용자 지정 복잡한 유효성 검사 주석을 코딩하는 데 몇 시간이 걸리거나 주석을 사용할 수없는 경우 유효성 검사기에 대한 강력한 유효성 검사를 유지하십시오. 나는 이전 프로젝트 에서이 작업을 수행했으며 매력적이고 빠르고 쉽게 작동했습니다.
경고 : 예외 처리를 위해 유효성 검사 처리 를 착각해서는 안됩니다 . 사용시기를 알려면 이 게시물 을 읽으십시오 .
참고 문헌 :