다음 예에서 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();
}
답변
유효성 검사 목적입니다.
유효성 검사 사용자 입력을 바인딩 한 후 모델의 유효성을 검사하는 것이 일반적입니다. 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/
답변
위의 답변에 추가하여 다음을 살펴보십시오. 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;
}
답변
IIRC @Valid는 Spring 주석이 아니라 JSR-303 주석 (Bean Validation 표준)입니다. 기본적으로 메서드에 보내는 데이터가 유효한지 여부를 확인합니다 (스크립트 파일의 유효성을 검사합니다).
답변
@Valid
그 자체로는 Spring과 관련이 없습니다. Bean Validation 사양의 일부 (여러 개가 있으며 2017 년 하반기 현재 최신 버전은 JSR 380)이지만 @Valid
매우 오래되어 JSR 303에서 파생되었습니다.
우리 모두 알다시피 Spring은 일반적으로 모든 다른 JSR 및 Java 라이브러리 (JPA, JTA, 캐싱 등)와의 통합을 제공하는 데 매우 뛰어나며 물론 그 사람들도 유효성 검사를 처리했습니다. 이를 용이하게하는 핵심 구성 요소 중 하나는 MethodValidationPostProcessor 입니다.
질문에 대답하려고 시도하는 @Valid
것은 객체의 최상위 요소가 아닌 복잡한 그래프를 검증하려는 경우 소위 검증 계단식으로 매우 편리합니다. 더 깊이 들어가고 싶을 때마다 @Valid
. 그것이 JSR이 지시하는 것입니다. Spring은 약간의 약간의 편차 (예를 들어 나는 RestController 메서드와 유효성 검사가 작동 하는 @Validated
대신에 넣어 @Valid
보았지만 일반 “서비스”bean에는 동일하게 적용되지 않음)를 준수합니다.
답변
public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {
if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");
@NotNull
따라서 조건이 필요하지 않은 경우이 주석이 유효하다고 생각 합니다.
답변
그냥 웹 응용 프로그램에서 위의 대답에 추가
@valid
사용되는 경우도 주석을 붙일 수 있고 검증 할 수있는 빈 검증 주석 예를 들어 @NotNull
, @Email
(최대 절전 모드 주석) 결과 값의 유효성을 검사 할 수 있습니다 사용자로부터 입력을 받고 바인딩 유효성 검사를해야합니다 동안 그래서 결과.
bindingResult.hasErrors()
유효성 검사가 실패했는지 알려줍니다.
답변
위에 언급되지 않은 @Valid의 또 다른 편리한 측면은 (예 : Postman을 사용하여 엔드 포인트 테스트) @Valid가 잘못된 REST 호출의 출력을 거의 읽을 수없는 텍스트 덩어리 대신 형식화 된 JSON으로 형식화한다는 것입니다. 이는 사용자를 위해 상업적으로 소비 가능한 API를 만드는 경우 매우 유용합니다.
