ฉันคิดว่าฉันรู้ว่าคำถามของคุณมุ่งหน้าไปทางไหน และเนื่องจากคำถามนี้เป็นคำถามที่ป๊อปอัปในผลการค้นหาหลักของ Google ฉันจึงสามารถตอบได้อย่างชัดเจนว่าคำอธิบายประกอบ @Valid ทำอะไรได้บ้าง
ฉันจะนำเสนอ 3 สถานการณ์เกี่ยวกับวิธีที่ฉันใช้ @Valid
รุ่น:
public class Employee{
private String name;
@NotNull(message="cannot be null")
@Size(min=1, message="cannot be blank")
private String lastName;
}
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){
}
ในสถานการณ์สมมตินี้คุณยังไม่ได้จัดการข้อผิดพลาดเหมือนในสถานการณ์แรก แต่คุณส่งต่อไปยังวิธีการอื่นที่จะดูแลข้อยกเว้นที่@Validทริกเกอร์เมื่อประมวลผลโมเดลฟอร์ม ตรวจสอบสิ่งนี้เพื่อดูว่าจะทำอย่างไรกับการทำแผนที่และทั้งหมดนั้น
ในการสรุป : @Valid ด้วยตัวเองโดยไม่ต้องทำอะไรเพิ่มเติมที่ทริกเกอร์การตรวจสอบความถูกต้องของฟิลด์คำอธิบายประกอบ JSR 303 ( @NotNull, @Email, @Size ฯลฯ ... ) คุณยังต้องระบุกลยุทธ์ว่าจะทำอย่างไร ด้วยผลการตรวจสอบดังกล่าว
หวังว่าฉันจะสามารถเคลียร์บางสิ่งบางอย่างสำหรับคนที่อาจสะดุดกับเรื่องนี้
@Valid
ในApplicationForm
พารามิเตอร์ แต่การตรวจสอบยังคงถูกยิงdate
(ตั้งค่าเป็นnull
) ฟิลด์ กรุณาอธิบาย.