ด้วย Spring MVC มี 3 วิธีในการตรวจสอบความถูกต้อง: การใช้คำอธิบายประกอบด้วยตนเองหรือทั้งสองอย่างผสมกัน ไม่มี "วิธีที่สะอาดและดีที่สุด" ที่ไม่ซ้ำกันในการตรวจสอบ แต่อาจมีวิธีหนึ่งที่เหมาะกับโครงการ / ปัญหา / บริบทของคุณดีกว่า
มามีผู้ใช้กัน:
public class User {
private String name;
...
}
วิธีที่ 1:ถ้าคุณมี Spring 3.x + และการตรวจสอบความถูกต้องง่าย ๆ ให้ใช้javax.validation.constraints
คำอธิบายประกอบ (หรือที่รู้จักในชื่อ JSR-303 คำอธิบายประกอบ)
public class User {
@NotNull
private String name;
...
}
คุณจะต้องใช้ผู้ให้บริการ JSR-303 ในไลบรารีของคุณเช่นHibernate Validatorซึ่งเป็นการนำไปใช้อ้างอิง (ไลบรารีนี้ไม่มีส่วนเกี่ยวข้องกับฐานข้อมูลและการทำแผนที่เชิงสัมพันธ์ แต่จะตรวจสอบความถูกต้อง :-)
จากนั้นในตัวควบคุมของคุณคุณจะมีสิ่งที่ชอบ:
@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @Valid @ModelAttribute("user") User user, BindingResult result){
if (result.hasErrors()){
// do something
}
else {
// do something else
}
}
สังเกตุ @Valid: หากผู้ใช้มีชื่อเป็นโมฆะ result.hasErrors () จะเป็นจริง
วิธีที่ 2:ถ้าคุณมีการตรวจสอบที่ซับซ้อน (เช่นตรรกะการตรวจสอบความถูกต้องทางธุรกิจขนาดใหญ่การตรวจสอบความถูกต้องแบบมีเงื่อนไขในหลาย ๆ ฟิลด์) หรือด้วยเหตุผลบางอย่างที่คุณไม่สามารถใช้วิธีที่ 1 ให้ใช้การตรวจสอบด้วยตนเอง เป็นการดีที่จะแยกรหัสของคอนโทรลเลอร์ออกจากตรรกะการตรวจสอบความถูกต้อง อย่าสร้างคลาสการตรวจสอบความถูกต้องตั้งแต่เริ่มต้นสปริงมีorg.springframework.validation.Validator
อินเทอร์เฟซที่ใช้งานง่าย(ตั้งแต่สปริง 2)
สมมติว่าคุณมี
public class User {
private String name;
private Integer birthYear;
private User responsibleUser;
...
}
และคุณต้องการทำการตรวจสอบที่ "ซับซ้อน" บางอย่างเช่น: หากอายุของผู้ใช้ต่ำกว่า 18 ผู้รับผิดชอบจะต้องไม่เป็นโมฆะและอายุของผู้รับผิดชอบจะต้องมีอายุมากกว่า 21 ปี
คุณจะทำอะไรแบบนี้
public class UserValidator implements Validator {
@Override
public boolean supports(Class clazz) {
return User.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
User user = (User) target;
if(user.getName() == null) {
errors.rejectValue("name", "your_error_code");
}
// do "complex" validation here
}
}
จากนั้นในคอนโทรลเลอร์ของคุณคุณจะต้อง:
@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @ModelAttribute("user") User user, BindingResult result){
UserValidator userValidator = new UserValidator();
userValidator.validate(user, result);
if (result.hasErrors()){
// do something
}
else {
// do something else
}
}
หากมีข้อผิดพลาดในการตรวจสอบ result.hasErrors () จะเป็นจริง
หมายเหตุ: คุณยังสามารถตั้งค่าเครื่องมือตรวจสอบความถูกต้องในวิธีการ @InitBinder ของคอนโทรลเลอร์ด้วย "binder.setValidator (... )" (ซึ่งในกรณีนี้การผสมวิธี 1 และ 2 จะไม่สามารถทำได้เนื่องจากคุณแทนที่ค่าเริ่มต้น ตรวจสอบ) หรือคุณสามารถยกตัวอย่างในตัวสร้างเริ่มต้นของตัวควบคุม หรือมี @ Component / @ Service UserValidator ที่คุณฉีด (@Autowired) ในคอนโทรลเลอร์ของคุณ: มีประโยชน์มากเพราะเครื่องมือตรวจสอบส่วนใหญ่เป็น singletons + การเยาะเย้ยการทดสอบหน่วยกลายเป็นเรื่องง่ายขึ้น + เครื่องมือตรวจสอบของคุณสามารถเรียกคอมโพเนนต์สปริงอื่น ๆ
วิธีที่ 3:
ทำไมไม่ใช้ทั้งสองวิธีร่วมกัน ตรวจสอบสิ่งที่ง่ายเช่นแอตทริบิวต์ "ชื่อ" ด้วยคำอธิบายประกอบ (มันรวดเร็วในการทำกระชับและอ่านง่ายขึ้น) เก็บการตรวจสอบความถูกต้องอย่างหนักสำหรับผู้ตรวจสอบความถูกต้อง (เมื่อต้องใช้เวลาหลายชั่วโมงในการเขียนบันทึกย่อการตรวจสอบความซับซ้อนที่กำหนดเองหรือเมื่อไม่สามารถใช้คำอธิบายประกอบได้) ฉันทำสิ่งนี้ในโครงการก่อนหน้ามันใช้งานได้อย่างมีเสน่ห์รวดเร็วและง่ายดาย
คำเตือน:คุณจะต้องไม่ผิดพลาดในการตรวจสอบการจัดการสำหรับการจัดการข้อยกเว้น อ่านโพสต์นี้เพื่อทราบเมื่อใช้
การอ้างอิง: