복붙노트

[SPRING] JSR-303 유효성 검사 그룹은 기본 그룹을 정의합니다.

SPRING

JSR-303 유효성 검사 그룹은 기본 그룹을 정의합니다.

JSR-303 유효성 검사 주석으로 주석 된 필드가 많은 bean이 있습니다. 필드 중 하나가 필수 조건이되지만 특정 조건에서만 필드가 새로 추가된다는 요구 사항이 있습니다.

나는 주변을 둘러 보았고 내가 필요로하는 것, 검증 그룹을 발견했다.

이것은 내가 지금 가지고있는 것입니다 :

public interface ValidatedOnCreationOnly {
}

@NotNull(groups = ValidatedOnCreationOnly.class)
private String employerId;
@Length(max = 255)
@NotNull
private String firstName;
@Length(max = 255)
@NotNull
private String lastName;

그러나 단위 테스트에서이 유효성 검사를 실행할 때 :

@Test
public void testEmployerIdCanOnlyBeSetWhenCreating() {
    EmployeeDTO dto = new EmployeeDTO();

    ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
    Set<ConstraintViolation<EmployeeDTO>> violations = vf.getValidator().validate(dto, EmployeeDTO.ValidatedOnCreationOnly.class);

    assertEquals(violations.size(), 3);
}

모든 그룹이 아닌 주석이 달린 검증은 무시되며 단 하나의 위반 만 발생합니다.

이 동작을 이해할 수 있지만 그룹에 모든 비 주석 매개 변수도 포함시킬 수있는 방법이 있는지 알고 싶습니다. 그렇지 않다면 다음과 같이해야합니다.

public interface AlwaysValidated {
}

public interface ValidatedOnCreationOnly extends AlwaysValidated {
}

@NotNull(groups = ValidatedOnCreationOnly.class)
private String employerId;
@Length(max = 255, groups = AlwaysValidated.class)
@NotNull(groups = AlwaysValidated.class)
private String firstName;
@Length(max = 255, groups = AlwaysValidated.class)
@NotNull(groups = AlwaysValidated.class)
private String lastName;

내가 작업하고있는 실제 클래스에는 훨씬 더 많은 필드가 있습니다 (약 20 개). 따라서이 메서드는 유효성 검사를 큰 혼란으로 나타내는 명확한 방법이었습니다.

더 좋은 방법이 있다면 누구나 말해 줄 수 있습니까? 아마 뭔가 :

vf.getValidator().validate(dto, EmployeeDTO.ValidatedOnCreationOnly.class, NonGroupSpecific.class);

저는 스프링 프로젝트에서 이것을 사용하고 있습니다. 스프링이 다른면을 가지고 있다면 기꺼이 알게 될 것입니다.

해결법

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

    1.기본 Bean 유효성 검사 그룹을 나타내는 javax.validation.groups.Default에 Default 그룹이 있습니다. 그룹 목록이 명시 적으로 정의되지 않은 경우 :

    기본 Bean 유효성 검사 그룹을 나타내는 javax.validation.groups.Default에 Default 그룹이 있습니다. 그룹 목록이 명시 적으로 정의되지 않은 경우 :

    이 그룹을 확장 할 수 있습니다.

    public interface ValidatedOnCreationOnly extends Default {}
    
  2. ==============================

    2.그냥 더 추가하고 싶었 :

    그냥 더 추가하고 싶었 :

    스프링 프레임 워크를 사용한다면 org.springframework.validation.Validator를 사용할 수있다.

    @Autowired
    private Validator validator;
    

    수동으로 유효성 검사를 수행하려면 다음을 수행하십시오.

    validator.validate(myObject, ValidationErrorsToException.getInstance());
    

    컨트롤러 :

    @RequestMapping(method = RequestMethod.POST)
    public Callable<ResultObject> post(@RequestBody @Validated(MyObject.CustomGroup.class) MyObject request) {
        // logic
    }
    

    이런 식으로 javax.validation.groups.Default로부터의 확장은 작동하지 않으므로 그룹에 Default.class를 포함시켜야합니다 :

    class MyObject {
    
        @NotNull(groups = {Default.class, CustomGroup.class})
        private String id;
    
        public interface CustomGroup extends Default {}
    }
    
  3. from https://stackoverflow.com/questions/35358447/jsr-303-validation-groups-define-a-default-group by cc-by-sa and MIT license