[java] @Valid와 Spring에서 @Validated의 차이점

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에만 해당되지는 않습니다.

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



답변

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

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

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


답변

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

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

}


답변

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

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

굴절


답변

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


답변