복붙노트

[SPRING] javax.validation.constraints의 주석이 작동하지 않습니다.

SPRING

javax.validation.constraints의 주석이 작동하지 않습니다.

@Size, @NotNull 등과 같은 javax.validation.constraints의 주석을 사용하려면 어떤 구성이 필요합니까? 내 코드는 다음과 같습니다.

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class Person {
      @NotNull
      private String id;

      @Size(max = 3)
      private String name;

      private int age;

      public Person(String id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
      }
}

다른 클래스에서이 클래스를 사용하려고하면 유효성 검사가 작동하지 않습니다 (즉, 객체가 오류없이 생성됨).

Person P = new Person(null, "Richard3", 8229));

왜 이것이 이드와 이름에 제약 조건을 적용하지 않습니까? 그 밖의 무엇을해야합니까?

해결법

  1. ==============================

    1.JSR-303 빈 검증이 스프링에서 작동하려면 몇 가지 것이 필요하다.

    JSR-303 빈 검증이 스프링에서 작동하려면 몇 가지 것이 필요하다.

    예:

    @RequestMapping("handler.do")
    public String myHandler(@Valid @ModelAttribute("form") SomeFormBean myForm, BindingResult result, Model model) {
        if(result.hasErrors()) {
          ...your error handling...
        } else {
          ...your non-error handling....
        }
    }
    
  2. ==============================

    2.Validator를 사용하여 클래스가 유효한지 확인해야합니다.

    Validator를 사용하여 클래스가 유효한지 확인해야합니다.

    Person person = ....;
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    validator = factory.getValidator();
    Set<ConstraintViolation<Person>> violations = validator.validate(person);
    

    그런 다음 반복 위반이 설정되면 위반 사항을 찾을 수 있습니다.

  3. ==============================

    3.유효성을 검사하려면 엔터티에서 유효성 검사기를 호출해야합니다. 그런 다음 ConstraintViolationException 집합을 얻을 것입니다. ConstraintViolationException은 기본적으로 Entity의 어느 필드에 제약 조건 위반이 있으며 정확히 무엇인지 표시합니다. 어쩌면 엔티티의 유효성을 검사 할 코드 중 일부를 공유 할 수도 있습니다.

    유효성을 검사하려면 엔터티에서 유효성 검사기를 호출해야합니다. 그런 다음 ConstraintViolationException 집합을 얻을 것입니다. ConstraintViolationException은 기본적으로 Entity의 어느 필드에 제약 조건 위반이 있으며 정확히 무엇인지 표시합니다. 어쩌면 엔티티의 유효성을 검사 할 코드 중 일부를 공유 할 수도 있습니다.

    자주 사용되는 기술은 @PrePersist에서 유효성 검사를 수행하고 트랜잭션 중에 여러 데이터 수정을 사용하는 경우 트랜잭션을 롤백하거나 유효성 검사 예외가 발생할 때 다른 작업을 수행하는 것입니다.

    코드는 다음과 같이되어야합니다.

    @PrePersist
    public void prePersist(SomeEntity someEntity){
        Validator validator = Validation.buildDefaultValidatorFactory.getValidator();
        Set<ConstraintViolation<SomeEntity>> = validator.validate(someEntity);
        //do stuff with them, like notify client what was the wrong field, log them, or, if empty, be happy
    }
    
  4. ==============================

    4.적어도 @NotNull 시나리오에서는 @NonNull을 롬복 라이브러리와 함께 사용할 수도 있습니다. 세부 정보 : https://projectlombok.org/api/lombok/NonNull.html

    적어도 @NotNull 시나리오에서는 @NonNull을 롬복 라이브러리와 함께 사용할 수도 있습니다. 세부 정보 : https://projectlombok.org/api/lombok/NonNull.html

  5. ==============================

    5.내 경우에는 내가 호출되지 않은 사용자 지정 클래스 수준 제약 조건이 있습니다.

    내 경우에는 내가 호출되지 않은 사용자 지정 클래스 수준 제약 조건이 있습니다.

    @CustomValidation // not called
    public class MyClass {
        @Lob
        @Column(nullable = false)
        private String name;
    }
    

    필드 레벨 제약 조건을 내 클래스에 추가하자마자 클래스 수준 제약 조건이 작동하기 시작했습니다.

    @CustomValidation // now it works. super.
    public class MyClass {
        @Lob
        @Column(nullable = false)
        @NotBlank // adding this made @CustomValidation start working
        private String name;
    }
    

    나에게 버그 투성이의 행동처럼 보이지만, 내가 생각하기에 충분히 쉽다.

  6. ==============================

    6.따라서 서비스 인터페이스에서 @Valid는 해당 객체에서만 작동합니다. ServiceRequest 객체의 계층 구조 내에 더 이상의 유효성 검사가 있으면 유효성 검사를 명시 적으로 트리거 할 수 있습니다. 그래서 이것이 내가 어떻게했는지입니다.

    따라서 서비스 인터페이스에서 @Valid는 해당 객체에서만 작동합니다. ServiceRequest 객체의 계층 구조 내에 더 이상의 유효성 검사가 있으면 유효성 검사를 명시 적으로 트리거 할 수 있습니다. 그래서 이것이 내가 어떻게했는지입니다.

    public class ServiceRequestValidator {
    
          private static Validator validator;
    
          @PostConstruct
          public void init(){
             validator = Validation.buildDefaultValidatorFactory().getValidator();
          }
    
          public static <T> void validate(T t){
            Set<ConstraintViolation<T>> errors = validator.validate(t);
            if(CollectionUtils.isNotEmpty(errors)){
              throw new ConstraintViolationException(errors);
            }
         }
    
    }
    

    객체에 대한 유효성 검사를 트리거하려면 객체 수준에서 다음 주석을 가져야합니다.

    @Valid
    @NotNull
    
  7. ==============================

    7.메서드 매개 변수의 경우 Objects.requireNonNull ()을 다음과 같이 사용할 수 있습니다. test (String str) {   Objects.requireNonNull (str); } 그러나 이것은 런타임시에만 검사되며 null이면 NPE를 던집니다. 전제 조건 확인과 같습니다. 그러나 그것은 당신이 찾고있는 것일 수 있습니다.

    메서드 매개 변수의 경우 Objects.requireNonNull ()을 다음과 같이 사용할 수 있습니다. test (String str) {   Objects.requireNonNull (str); } 그러나 이것은 런타임시에만 검사되며 null이면 NPE를 던집니다. 전제 조건 확인과 같습니다. 그러나 그것은 당신이 찾고있는 것일 수 있습니다.

  8. ==============================

    8.나는 몇 년 후 여기에 와서, 위의 atrain의 의견 덕분에 고칠 수 있었다. 필자의 경우, @Size로 주석 처리 된 Object (POJO의 경우)를받는 API에서 @Valid가 빠졌습니다. 그것은 그 문제를 해결했습니다.

    나는 몇 년 후 여기에 와서, 위의 atrain의 의견 덕분에 고칠 수 있었다. 필자의 경우, @Size로 주석 처리 된 Object (POJO의 경우)를받는 API에서 @Valid가 빠졌습니다. 그것은 그 문제를 해결했습니다.

    @Size로 주석 된 변수에 @Valid 또는 @NotBlank와 같은 추가 주석을 추가 할 필요가 없습니다. 변수의 제약 조건과 API에서 언급 한 내용은 ...

    Pojo 클래스 :

    ...
    @Size(min = MIN_LENGTH, max = MAX_LENGTH);
    private String exampleVar;
    ...
    

    API 클래스 :

    ...
    public void exampleApiCall(@RequestBody @Valid PojoObject pojoObject){
      ...
    }
    

    감사와 환호

  9. ==============================

    9.나는 봄에 상당히 익숙하지 않으므로 소금 한알로 대답을하십시오. 나는 또한 그것을 사용할 때 @ NotNull을 사용할 수 없었다. 입력 필드가있는 화면이 있는데 입력하지 않았고 화면을 앞으로 옮겼습니다 (결국 일부 DB에 저장하기 위해).

    나는 봄에 상당히 익숙하지 않으므로 소금 한알로 대답을하십시오. 나는 또한 그것을 사용할 때 @ NotNull을 사용할 수 없었다. 입력 필드가있는 화면이 있는데 입력하지 않았고 화면을 앞으로 옮겼습니다 (결국 일부 DB에 저장하기 위해).

    나는 단지 @NotBlank에 비틀 거 리기 위해서 나의 뇌를 짖고 있었다. 어쨌든 그건 내 대답 이었어. 문제의 필드는 공백이었습니다. ""라고 말하면 공 문자열이거나 공백 문자열이 아닙니다. 그래서 @NotBlank에 대한 수표가 잡혔습니다.

    그것이 당신을 도울 지 확신 할 수는 없지만 일부 @NotNulls가 잡히지 않으면 어려움을 겪는다면이 가능성을 조사 할 수 없습니다.

  10. ==============================

    10.@Valid를 각 멤버 변수에 추가해야합니다.이 멤버 변수는 유효성 검사 제약 조건이 포함 된 객체이기도합니다.

    @Valid를 각 멤버 변수에 추가해야합니다.이 멤버 변수는 유효성 검사 제약 조건이 포함 된 객체이기도합니다.

  11. from https://stackoverflow.com/questions/8756768/annotations-from-javax-validation-constraints-not-working by cc-by-sa and MIT license