ความแตกต่างระหว่าง @Valid และ @Validated ในฤดูใบไม้ผลิ


110

Spring รองรับสองวิธีการตรวจสอบที่แตกต่างกัน: การตรวจสอบความถูกต้องของสปริงและการตรวจสอบความถูกต้องของถั่ว JSR-303 ทั้งสองอย่างสามารถใช้ได้โดยการกำหนด Spring validator ที่มอบหมายให้กับ delegators อื่น ๆ รวมทั้ง bean validator จนถึงตอนนี้ดีมาก

แต่เมื่อใส่คำอธิบายประกอบวิธีเพื่อขอการตรวจสอบความถูกต้องก็เป็นอีกเรื่องหนึ่ง ฉันสามารถใส่คำอธิบายประกอบแบบนี้ได้

@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Valid @RequestBody TestObject obj, BindingResult result) {

หรือแบบนี้

@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Validated @RequestBody TestObject obj, BindingResult result) {

นี่คือ @Valid javax.validation.Validและ @Validated เป็นorg.springframework.validation.annotation.Validated เอกสารสำหรับหลังกล่าวว่า

ตัวแปรของ JSR-303 Valid ซึ่งสนับสนุนข้อกำหนดของกลุ่มการตรวจสอบความถูกต้อง ออกแบบมาเพื่อการใช้งานที่สะดวกด้วยการรองรับ JSR-303 ของ Spring แต่ไม่ใช่เฉพาะ JSR-303

ซึ่งไม่ได้ช่วยอะไรมากเพราะมันไม่ได้บอกว่ามันแตกต่างกันอย่างไร ถ้าเลย. ทั้งสองดูเหมือนจะทำงานได้ดีสำหรับฉัน


2
อาจจะน่าสนใจ: stackoverflow.com/questions/18911154/…
Wim Deblauwe

4
"การสนับสนุนข้อกำหนดของกลุ่มการตรวจสอบ"เป็นคำสั่งที่ชัดเจนมาก
ที่ดีขึ้น

ฉันควรคิดว่า Valid นั้นควบคู่ไปกับการตรวจสอบความถูกต้อง JSR 303 อย่างแน่นหนา (NotNull ฯลฯ ) ในขณะที่คุณสามารถสร้างการตรวจสอบความถูกต้อง / กลุ่มอื่น ๆ และตรวจสอบได้ใน Validated
Atul

@zeroflagL จริง แต่เนื่องจากฉันไม่เคยใช้เลยฉันจึงพลาดจุดนั้นและแก้ไขในส่วน“ ไม่ใช่ JSR-303 เฉพาะ” แทน ตอนนี้ชัดเจนแล้ว
Sergei Tachenov

คำตอบ:


84

ตามที่คุณยกมาจากเอกสารนี้@Validatedมีการเพิ่มเพื่อสนับสนุน "validation groups" นั่นคือกลุ่มของฟิลด์ใน bean ที่ผ่านการตรวจสอบแล้ว สามารถใช้ในรูปแบบหลายขั้นตอนซึ่งคุณสามารถตรวจสอบชื่ออีเมล ฯลฯ ในขั้นตอนแรกและช่องอื่น ๆ ในขั้นตอนต่อไปนี้

สาเหตุที่ไม่เพิ่มลงใน@Validคำอธิบายประกอบเป็นเพราะเป็นมาตรฐานโดยใช้กระบวนการชุมชน java (JSR-303) ซึ่งต้องใช้เวลาและผู้พัฒนา Spring ต้องการอนุญาตให้ผู้ใช้ใช้ฟังก์ชันนี้ได้เร็วขึ้น

ไปที่ตั๋ว jira นี้เพื่อดูว่าคำอธิบายประกอบเกิดขึ้นได้อย่างไร


118

คำตอบที่ตรงไปตรงมามากขึ้น สำหรับผู้ที่ยังไม่ทราบว่า"validation group"คืออะไร

การใช้งานสำหรับการ@Validตรวจสอบความถูกต้อง

ตัวควบคุม:

@RequestMapping(value = "createAccount")
public String stepOne(@Valid Account account) {...}

แบบฟอร์มวัตถุ:

public class Account {

    @NotBlank
    private String username;

    @Email
    @NotBlank
    private String email;

}

การใช้งานสำหรับ@ValidatedValidation Group
ที่มา: http://blog.codeleak.pl/2014/08/validation-groups-in-spring-mvc.html

ตัวควบคุม:

@RequestMapping(value = "stepOne")
public String stepOne(@Validated(Account.ValidationStepOne.class) Account account) {...}

@RequestMapping(value = "stepTwo")
public String stepTwo(@Validated(Account.ValidationStepTwo.class) Account account) {...}

แบบฟอร์มวัตถุ:

public class Account {

    @NotBlank(groups = {ValidationStepOne.class})
    private String username;

    @Email(groups = {ValidationStepOne.class})
    @NotBlank(groups = {ValidationStepOne.class})
    private String email;

    @NotBlank(groups = {ValidationStepTwo.class})
    @StrongPassword(groups = {ValidationStepTwo.class})
    private String password;

    @NotBlank(groups = {ValidationStepTwo.class})
    private String confirmedPassword;

}

ขอบคุณ @ Zhuhang.jasper สำหรับการอธิบายรายละเอียดด้วยความเรียบง่าย
Gautam Tyagi

นี่คือสิ่งที่ฉันค้นหาในช่วง 2 ชั่วโมงที่ผ่านมาขอบคุณ @ Zhuhang.jasper
Shady Hussein

4

ในตัวอย่างโค้ดของคำถาม@Validและ@Validatedไม่สร้างความแตกต่าง แต่ถ้า@RequestBodyมีการใส่คำอธิบายประกอบด้วยListวัตถุหรือเป็นค่าสตริงที่มีคำอธิบายประกอบ@RequestParamการตรวจสอบความถูกต้องจะไม่มีผล

เราสามารถใช้@Validatedความสามารถในการตรวจสอบระดับวิธีการเพื่อให้มันทำงานได้ เพื่อให้บรรลุเป้าหมายนี้ประเด็นสำคัญคือการจัดวาง@Validatedในชั้นเรียน นี่อาจเป็นข้อแตกต่างที่สำคัญอีกประการหนึ่งระหว่าง@Validและ@Validatedในกรอบสปริง

อ้างอิง


คุณช่วยอธิบายได้ไหมว่าทำไมคำอธิบายประกอบจึงไม่มีผลกับListวัตถุ? ฉันคิดว่าสิ่งนี้จะใช้ไม่ได้กับคอลเลกชันอื่น ๆ เช่นMap? บางทีคุณอาจให้คำอธิบายโดยละเอียดเพิ่มเติมในคำถามของฉัน: stackoverflow.com/questions/60167961/…
Theiaz

1
@Theiaz ตามใจ
Lebecca

1

นอกเหนือจากข้างต้นคุณสามารถใช้@Validกับโดเมน / ฟิลด์สำหรับการตรวจสอบความถูกต้องแบบซ้อนเท่านั้นไม่ใช่กับไฟล์@validated.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.