@Valid 주석은 Spring에서 무엇을 의미합니까?


87

다음 예에서 ScriptFile매개 변수는 @Valid주석으로 표시됩니다 .

@Valid주석은 무엇을 합니까?

@RequestMapping(value = "/scriptfile", method = RequestMethod.POST)    
public String create(@Valid ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {    
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");        
    if (result.hasErrors()) {        
        modelMap.addAttribute("scriptFile", scriptFile);            
        modelMap.addAttribute("showcases", ShowCase.findAllShowCases());            
        return "scriptfile/create";            
    }        
    scriptFile.persist();        
    return "redirect:/scriptfile/" + scriptFile.getId();        
}    

답변:


63

유효성 검사 목적입니다.

유효성 검사 사용자 입력을 바인딩 한 후 모델의 유효성을 검사하는 것이 일반적입니다. Spring 3는 JSR-303을 통한 선언적 유효성 검사를 지원합니다. 이 지원은 Hibernate Validator와 같은 JSR-303 공급자가 클래스 경로에있는 경우 자동으로 활성화됩니다. 활성화되면 @Valid 어노테이션으로 Controller 메소드 매개 변수에 주석을 달아 간단히 유효성 검증을 트리거 할 수 있습니다. 수신 POST 매개 변수를 바인딩 한 후 AppointmentForm이 유효성 검증됩니다. 이 경우 날짜 필드 값이 null이 아니고 나중에 발생하는지 확인합니다.


자세한 정보는 여기를 참조하십시오 :
http://blog.springsource.com/2009/11/17/spring-3-type-conversion-and-validation/


36

위의 답변에 추가하여 다음을 살펴보십시오. AppointmentFormdate열에는 몇 가지 주석이 추가되었습니다. @Valid에 대한 유효성 검사를 트리거 하는 주석이 있습니다 AppointmentForm(이 경우 @NotNull@Future). 이러한 주석은 다른 JSR-303 공급자 (예 : Hibernate, Spring..etc)에서 올 수 있습니다.

    @RequestMapping(value = "/appointments", method = RequestMethod.POST)
    public String add(@Valid AppointmentForm form, BindingResult result) {
        ....
    }

    static class AppointmentForm {

        @NotNull @Future
        private Date date;
    }

1
비슷한 코드가 있습니다. 나는 제거했다 @ValidApplicationForm아직 검증이에 발사 된 매개 변수 만 date(세트로 null) 필드. 설명 해주십시오.
lupchiazoem

17

IIRC @Valid는 Spring 주석이 아니라 JSR-303 주석 (Bean Validation 표준)입니다. 기본적으로 메서드에 보내는 데이터가 유효한지 여부를 확인합니다 (스크립트 파일의 유효성을 검사합니다).


2
"스크립트 파일의 유효성을 검사합니다"라는 것은 무엇을 의미합니까? null이 아닌지, 구문 또는 내용이 있는지 확인하십시오. 즉, 무엇을 어떻게 검증합니까? 사용자가 무언가를 구현해야합니까? 그것에 대한 정보는 어디서 얻을 수 있습니까? 감사합니다!
조카

@nephewtom의 질문에 대답하십시오. "무엇에 대한"누락 된 요점을 검증하는 것은 충분하지 않습니까?
모나미

17

@Valid그 자체로는 Spring과 관련이 없습니다. Bean Validation 사양의 일부 (여러 개가 있으며 2017 년 하반기 현재 최신 버전은 JSR 380)이지만 @Valid매우 오래되어 JSR 303에서 파생되었습니다.

우리 모두 알다시피 Spring은 일반적으로 모든 다른 JSR 및 Java 라이브러리 (JPA, JTA, 캐싱 등)와의 통합을 제공하는 데 매우 뛰어나며 물론 그 사람들도 유효성 검사를 처리했습니다. 이를 용이하게하는 핵심 구성 요소 중 하나는 MethodValidationPostProcessor 입니다.

질문에 대답하려고 시도하는 @Valid것은 객체의 최상위 요소가 아닌 복잡한 그래프를 검증하려는 경우 소위 검증 계단식으로 매우 편리합니다. 더 깊이 들어가고 싶을 때마다 @Valid. 그것이 JSR이 지시하는 것입니다. Spring은 약간의 약간의 편차 (예를 들어 나는 RestController 메서드와 유효성 검사가 작동 하는 @Validated대신에 넣어 @Valid보았지만 일반 "서비스"bean에는 동일하게 적용되지 않음)를 준수합니다.


그러나 무엇을 검증합니까?
조카

자세히 설명 해주세요, @nephewtom. 무엇을 명확히하고 싶습니까?
yuranos

JSR 303 : Bean Validation, beanvalidation.org/1.0/spec을 읽었 지만 여전히에서 수행 할 유효성 검사를 얻지 못합니다 ScriptFile scriptFile.
조카

그 안에 ScriptFile에는 아마도 많은 필드가 있으며 해당 필드에도 주석이 있습니다. 이것은 유효성 검사가 시작되는 곳입니다. 원래 질문에 따르면 ScriptFile 클래스 내부에 정확히 무엇이 있는지 명확하지 않습니다.
yuranos

알았어 고마워. 필드가 String, Integer 및 Bean 인 경우 유효성을 검사 할 수있는 예를 넣을 수 있습니까?
조카

2
public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {    
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");        

@NotNull따라서 조건이 필요하지 않은 경우이 주석이 유효하다고 생각 합니다.


1

그냥 웹 응용 프로그램에서 위의 대답에 추가 @valid사용되는 경우도 주석을 붙일 수 있고 검증 할 수있는 빈 검증 주석 예를 들어 @NotNull, @Email(최대 절전 모드 주석) 결과 값의 유효성을 검사 할 수 있습니다 사용자로부터 입력을 받고 바인딩 유효성 검사를해야합니다 동안 그래서 결과. bindingResult.hasErrors()유효성 검사가 실패했는지 알려줍니다.


1

위에 언급되지 않은 @Valid의 또 다른 편리한 측면은 (예 : Postman을 사용하여 엔드 포인트 테스트) @Valid가 잘못된 REST 호출의 출력을 거의 읽을 수없는 텍스트 덩어리 대신 형식화 된 JSON으로 형식화한다는 것입니다. 이는 사용자를 위해 상업적으로 소비 가능한 API를 만드는 경우 매우 유용합니다.


0

나는 당신의 질문이 어디로 향하고 있는지 알고 있다고 생각합니다. 그리고이 질문은 구글 검색 결과에 나타나는 질문이기 때문에 @Valid 주석이하는 일에 대해 평범한 답변을 드릴 수 있습니다.

@Valid를 어떻게 사용했는지에 대한 3 가지 시나리오를 제시하겠습니다.

모델:

public class Employee{
private String name;
@NotNull(message="cannot be null")
@Size(min=1, message="cannot be blank")
private String lastName;
 //Getters and Setters for both fields.
 //...
}

JSP :

...
<form:form action="processForm" modelAttribute="employee">
 <form:input type="text" path="name"/>
 <br>
 <form:input type="text" path="lastName"/>
<form:errors path="lastName"/>
<input type="submit" value="Submit"/>
</form:form>
...

시나리오 1의 컨트롤러 :

     @RequestMapping("processForm")
        public String processFormData(@Valid @ModelAttribute("employee") Employee employee){
        return "employee-confirmation-page";
    }

이 시나리오에서는 lastName 필드가 비어있는 양식을 제출 한 후 유효성 검사 규칙을 적용하고 있지만 전혀 처리하지 않기 때문에 오류 페이지가 표시됩니다.

해당 오류의 예 : 예외 페이지

시나리오 2 용 컨트롤러 :

 @RequestMapping("processForm")
    public String processFormData(@Valid @ModelAttribute("employee") Employee employee,
BindingResult bindingResult){
                return bindingResult.hasErrors() ? "employee-form" : "employee-confirmation-page";
            }

이 시나리오에서는 해당 유효성 검사의 모든 결과를 bindingResult로 전달하므로 해당 양식의 유효성 검사 결과로 수행 할 작업을 결정하는 것은 사용자에게 달려 있습니다.

시나리오 3 용 컨트롤러 :

@RequestMapping("processForm")
    public String processFormData(@Valid @ModelAttribute("employee") Employee employee){
                return "employee-confirmation-page";
            }
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, String> invalidFormProcessor(MethodArgumentNotValidException ex){
  //Your mapping of the errors...etc
}

이 시나리오에서는 여전히 첫 번째 시나리오에서와 같이 오류를 처리하지 않지만 양식 모델을 처리 할 때 @Valid가 트리거 하는 예외를 처리 할 다른 메서드로 전달합니다 . 이것을 확인 하고 매핑으로 무엇을 할 것인지 확인 하십시오.

요약하자면, @Valid 자체적으로 유효성 검사 JSR 303 주석 필드 ( @NotNull, @Email, @Size 등 ... ) 의 유효성 검사를 트리거하는 작업을 수행하지 않고 수행 할 작업에 대한 전략을 지정해야합니다. 상기 검증 결과와 함께.

이것에 걸려 넘어 질 수있는 사람들을 위해 내가 뭔가를 클리어 할 수 있기를 바랍니다.

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