수색…


소개

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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow