[SPRING] JSR-303 유효성 검사 그룹은 기본 그룹을 정의합니다.
SPRINGJSR-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.기본 Bean 유효성 검사 그룹을 나타내는 javax.validation.groups.Default에 Default 그룹이 있습니다. 그룹 목록이 명시 적으로 정의되지 않은 경우 :
기본 Bean 유효성 검사 그룹을 나타내는 javax.validation.groups.Default에 Default 그룹이 있습니다. 그룹 목록이 명시 적으로 정의되지 않은 경우 :
이 그룹을 확장 할 수 있습니다.
public interface ValidatedOnCreationOnly extends Default {}
-
==============================
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 {} }
from https://stackoverflow.com/questions/35358447/jsr-303-validation-groups-define-a-default-group by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @Primary의 Spring XML과 동일합니다. (0) | 2019.05.30 |
---|---|
[SPRING] Spring CaffeineCacheManager에 여러 개의 카페인로드 캐시가 추가되었습니다. (0) | 2019.05.30 |
[SPRING] iBatis, spring, 실행되는 SQL을 어떻게 로그합니까? (0) | 2019.05.29 |
[SPRING] Spring rest controller에서 일반 json body에 액세스하는 방법은 무엇입니까? (0) | 2019.05.29 |
[SPRING] @PostConstruct 주석 및 스프링 수명주기 (0) | 2019.05.29 |