@Valid와 Spring에서 @Validated의 차이점


107

Spring은 Spring 유효성 검사와 JSR-303 빈 유효성 검사의 두 가지 다른 유효성 검사 방법을 지원합니다. 둘 다 빈 유효성 검사기를 포함하여 다른 위임자에게 위임하는 Spring 유효성 검사기를 정의하여 사용할 수 있습니다. 여태까지는 그런대로 잘됐다.

그러나 실제로 유효성 검사를 요청하는 메서드에 주석을다는 것은 또 다른 이야기입니다. 이렇게 주석을 달 수 있습니다

@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Valid @RequestBody TestObject obj, BindingResult result) {

또는 이렇게

@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Validated @RequestBody TestObject obj, BindingResult result) {

여기서 @Valid는 javax.validation.Valid 이고 @Validated는 org.springframework.validation.annotation.Validated 입니다. 후자에 대한 문서는

검증 그룹의 사양을 지원하는 JSR-303의 유효한 변형입니다. Spring의 JSR-303 지원과 함께 편리하게 사용하도록 설계되었지만 JSR-303에만 해당되지는 않습니다.

그것이 어떻게 다른지 정확히 말해주지 않기 때문에별로 도움이되지 않습니다. 만약 그렇다면. 둘 다 나를 위해 꽤 잘 작동하는 것 같습니다.


2
: 흥미로운 일이 될 수 있음 stackoverflow.com/questions/18911154/...
빔 Deblauwe

4
"유효성 그룹의 사양 지원" 은 매우 명시적인 진술입니다.
더 나은 올리버

Valid는 JSR 303 유효성 검사 (NotNull 등)와 밀접하게 결합되어 있다고 생각해야합니다. 다른 유효성 검사 / 그룹을 만들고 유효성 검사에 체크인하도록 할 수 있습니다.
아툴

@zeroflagL, 사실입니다.하지만 사용하지 않았기 때문에 요점을 놓치고 대신 "JSR-303 전용이 아님"부분에 집중했습니다. 이제 분명합니다.
세르게이 Tachenov

답변:


83

문서에서 인용했듯이 @Validated"검증 그룹", 즉 검증 된 빈의 필드 그룹을 지원하기 위해 추가되었습니다. 이것은 첫 번째 단계에서 이름, 이메일 등을 확인한 다음 다음 단계에서 다른 필드를 확인할 수있는 다단계 양식에서 사용할 수 있습니다.

이것이 @Valid주석에 추가되지 않은 이유 는 자바 커뮤니티 프로세스 (JSR-303)를 사용하여 표준화 되었기 때문에 시간이 걸리고 Spring 개발자는 사람들이이 기능을 더 빨리 사용할 수 있기를 원했기 때문입니다.

이 jira 티켓 으로 이동 하여 주석이 어떻게 생성되었는지 확인하십시오.


114

더 직접적인 대답. 아직도 도대체 무엇이 "검증 그룹" 인지 모르는 사람들을 위해 .

@Valid검증을 위한 사용법

제어 장치:

@RequestMapping(value = "createAccount")
public String stepOne(@Valid Account account) {...}

양식 개체 :

public class Account {

    @NotBlank
    private String username;

    @Email
    @NotBlank
    private String email;

}

에 대한 사용 @Validated확인 그룹
출처 : http://blog.codeleak.pl/2014/08/validation-groups-in-spring-mvc.html

제어 장치:

@RequestMapping(value = "stepOne")
public String stepOne(@Validated(Account.ValidationStepOne.class) Account account) {...}

@RequestMapping(value = "stepTwo")
public String stepTwo(@Validated(Account.ValidationStepTwo.class) Account account) {...}

양식 개체 :

public class Account {

    @NotBlank(groups = {ValidationStepOne.class})
    private String username;

    @Email(groups = {ValidationStepOne.class})
    @NotBlank(groups = {ValidationStepOne.class})
    private String email;

    @NotBlank(groups = {ValidationStepTwo.class})
    @StrongPassword(groups = {ValidationStepTwo.class})
    private String password;

    @NotBlank(groups = {ValidationStepTwo.class})
    private String confirmedPassword;

}

매우 간단하게 자세히 설명해 주신 @ Zhuhang.jasper에게 감사드립니다.
Gautam Tyagi

이것이 내가 지난 2 시간 동안 검색해 온 것입니다. 감사합니다. @ Zhuhang.jasper
Shady Hussein

감사합니다 @zhuhang. 이것을 찾고있었습니다.
Vishnu Dahatonde

4

예제 코드에서 질문의 코드 조각 @Valid@Validated아무런 차이도하지 않습니다. 그러나 @RequestBodyList객체 로 주석이 추가 되거나로 주석이 달린 문자열 값인 @RequestParam경우 유효성 검사가 적용되지 않습니다.

우리는 사용할 수 있습니다 @Validated작동하도록의 메소드 레벨의 검증 기능을. 이를 달성하기 위해 핵심 @Validated은 수업 에 배치 하는 것입니다. 이 사이 또 다른 중요한 차이가있을 수 있습니다 @Valid@Validated스프링 프레임 워크입니다.

굴절


주석이 List객체에 영향을 미치지 않는 이유를 설명해 주 시겠습니까? 나는 이것이 다른 컬렉션에서도 작동하지 않을 것이라고 가정합니다 Map. 내 질문에 대해 더 자세한 설명을
해주실 수 있습니다

1
@Theiaz 원하는대로
Lebecca

1

위 외에도 @Valid중첩 된 유효성 검사를 위해 도메인 / 필드 에만 적용 할 수 있으며 @validated.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.