spring
Spring JSR 303 Bean 유효성 검사
수색…
소개
Spring에는 JSR303 bean validation 지원이있다. 이것을 사용하여 입력 빈 유효성 검사를 수행 할 수 있습니다. JSR303을 사용하여 비즈니스 로직의 검증 로직을 분리합니다.
JSR303 스프링 예제의 주석 기반 유효성 검사
JSR 303 구현을 클래스 경로에 추가하십시오. 가장 많이 사용되는 것은 Hibernate의 Hibernate validator이다.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.2.0.Final</version>
</dependency>
시스템에 사용자를 생성하는 나머지 API가 있다고 가정 해 보겠습니다.
@RequestMapping(value="/registeruser", method=RequestMethod.POST)
public String registerUser(User user);
입력 json 샘플은 다음과 같습니다.
{"username" : "[email protected]", "password" : "password1", "password2":"password1"}
User.java
public class User {
private String username;
private String password;
private String password2;
getXXX and setXXX
}
사용자 클래스에 JSR 303 검증을 아래와 같이 정의 할 수 있습니다.
public class User {
@NotEmpty
@Size(min=5)
@Email
private String username;
@NotEmpty
private String password;
@NotEmpty
private String password2;
}
우리는 또한 패스워드와 패스워드 2 (패스워드 확인)와 같은 비지니스 밸리데이터가 동일 할 필요가있을 수도 있습니다. 왜냐하면 아래와 같이 커스텀 밸리데이터를 추가 할 수 있기 때문입니다. 데이터 필드에 주석을 달기위한 사용자 정의 주석을 작성하십시오.
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PasswordValidator.class)
public @interface GoodPassword {
String message() default "Passwords wont match.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
검증 논리를 적용하기위한 Validator 클래스를 작성합니다.
public class PastValidator implements ConstraintValidator<GoodPassword, User> {
@Override
public void initialize(GoodPassword annotation) {}
@Override
public boolean isValid(User user, ConstraintValidatorContext context) {
return user.getPassword().equals(user.getPassword2());
}
}
이 유효성 검사를 사용자 클래스에 추가
@GoodPassword
public class User {
@NotEmpty
@Size(min=5)
@Email
private String username;
@NotEmpty
private String password;
@NotEmpty
private String password2;
}
@Valid는 Spring에서 유효성 검사를 트리거합니다. BindingResult는 유효성 검사 후에 오류 목록이있는 Spring에 의해 삽입 된 객체입니다.
public String registerUser(@Valid User user, BindingResult result);
JSR 303 주석에는 사용자 정의 메시지를 제공하는 데 사용할 수있는 메시지 속성이 있습니다.
@GoodPassword
public class User {
@NotEmpty(message="Username Cant be empty")
@Size(min=5, message="Username cant be les than 5 chars")
@Email(message="Should be in email format")
private String username;
@NotEmpty(message="Password cant be empty")
private String password;
@NotEmpty(message="Password2 cant be empty")
private String password2;
}
Spring JSR 303 Validation - 오류 메시지 사용자 정의
유효성 검사 주석이있는 간단한 클래스가 있다고 가정합니다.
public class UserDTO {
@NotEmpty
private String name;
@Min(18)
private int age;
//getters/setters
}
UserDTO 유효성을 검사하는 컨트롤러.
@RestController
public class ValidationController {
@RequestMapping(value = "/validate", method = RequestMethod.POST)
public ResponseEntity<String> check(@Valid @RequestBody UserDTO userDTO,
BindingResult bindingResult) {
return new ResponseEntity<>("ok" , HttpStatus.OK);
}
}
그리고 시험.
@Test
public void testValid() throws Exception {
TestRestTemplate template = new TestRestTemplate();
String url = base + contextPath + "/validate";
Map<String, Object> params = new HashMap<>();
params.put("name", "");
params.put("age", "10");
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.add("Content-Type", "application/json");
HttpEntity<Map<String, Object>> request = new HttpEntity<>(params, headers);
String res = template.postForObject(url, request, String.class);
assertThat(res, equalTo("ok"));
}
이름과 나이는 모두 유효하지 않으므로 BindingResult에는 두 가지 유효성 검사 오류가 있습니다. 각각은 코드 배열을 가지고 있습니다.
최소 확인을위한 코드
0 = "Min.userDTO.age"
1 = "Min.age"
2 = "Min.int"
3 = "Min"
그리고 NotEmpty 체크
0 = "NotEmpty.userDTO.name"
1 = "NotEmpty.name"
2 = "NotEmpty.java.lang.String"
3 = "NotEmpty"
custom.properties 파일을 추가하여 기본 메시지를 대체하십시오.
@SpringBootApplication
@Configuration
public class DemoApplication {
@Bean(name = "messageSource")
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource bean = new ReloadableResourceBundleMessageSource();
bean.setBasename("classpath:custom");
bean.setDefaultEncoding("UTF-8");
return bean;
}
@Bean(name = "validator")
public LocalValidatorFactoryBean validator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());
return bean;
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
custom.properties 파일에 행을 추가하면
NotEmpty=The field must not be empty!
오류에 대한 새 값이 표시됩니다. 메시지 유효성 검사기를 해결하려면 올바른 메시지를 찾기 위해 처음부터 코드를 살펴보십시오.
따라서 @NotEmpty
주석이 사용되는 모든 경우에 대해 .properties 파일에서 NotEmpty
키를 정의 할 때 우리의 메시지가 적용됩니다.
우리가 메시지를 정의한다면
Min.int=Some custom message here.
우리가 min value에 정수 값을 적용하는 모든 주석은 새로 정의 된 메시지를 사용합니다.
유효성 검증 오류 메시지를 국지화해야하는 경우 동일한 논리를 적용 할 수 있습니다.
중첩 된 POJO를 유효하게하는 유효한 사용법
우리가 검증해야하는 POJO 클래스가 있다고 가정하자.
public class User {
@NotEmpty
@Size(min=5)
@Email
private String email;
}
및 사용자 인스턴스의 유효성을 검사하는 제어기 메소드
public String registerUser(@Valid User user, BindingResult result);
우리가 유효성을 검사해야하는 중첩 POJO 주소로 사용자를 확장합시다.
public class Address {
@NotEmpty
@Size(min=2, max=3)
private String countryCode;
}
중첩 된 POJO의 유효성 검사를 실행하려면 주소 필드에 @Valid
주석을 추가하십시오.
public class User {
@NotEmpty
@Size(min=5)
@Email
private String email;
@Valid
private Address address;
}