@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

위의 답변에 추가하여 다음을 살펴보십시오. AppointmentForm의 date열에는 몇 가지 주석이 추가되었습니다. @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
비슷한 코드가 있습니다. 나는 제거했다 @Valid에 ApplicationForm아직 검증이에 발사 된 매개 변수 만 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.