Baharda @Valid ve @Validated arasındaki fark


110

Spring, iki farklı doğrulama yöntemini destekler: Yay doğrulama ve JSR-303 fasulye doğrulama. Her ikisi de, fasulye doğrulayıcısı da dahil olmak üzere diğer delegatörlere delege eden bir Bahar doğrulayıcı tanımlanarak kullanılabilir. Çok uzak çok iyi.

Ancak doğrulama istemek için yöntemlere açıklama eklerken, bu başka bir hikaye. Böyle açıklama ekleyebilirim

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

ya da bunun gibi

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

Burada, @Valid javax.validation.Valid ve @Validated ise org.springframework.validation.annotation.Validated . İkincisi için dokümanlar diyor ki

Doğrulama gruplarının belirtimini destekleyen JSR-303'ün Geçerli Varyantı. Spring'in JSR-303 desteğiyle rahat kullanım için tasarlanmıştır, ancak JSR-303'e özel değildir.

bu pek yardımcı olmuyor çünkü nasıl farklı olduğunu tam olarak söylemiyor. Hiç değilse. İkisi de benim için oldukça iyi çalışıyor gibi görünüyor.



4
"doğrulama gruplarının özelliklerini desteklemek" çok açık bir ifadedir.
daha iyi bir oliver

Valid'in JSR 303 doğrulamaları (NotNull, vb.) İle sıkı bir şekilde bağlantılı olduğunu düşünmeliyim. Oysa başka doğrulama / gruplar oluşturabilir ve bunların Doğrulanmış olarak kontrol edilmesini sağlayabilirsiniz.
Atul

@zeroflagL, doğru, ama hiç kullanmadığım için noktayı kaçırdım ve bunun yerine "JSR-303'e özel değil" kısmına sabitledim. Şimdi temiz.
Sergei Tachenov

Yanıtlar:


84

Belgelerden alıntı yaptığınız gibi, @Validated"doğrulama gruplarını", yani doğrulanmış çekirdekteki alan grubunu desteklemek için eklendi. Bu, ilk adımda ad, e-posta vb. Doğrulayabileceğiniz çok adımlı formlarda ve ardından sonraki adım (lar) da diğer alanlarda kullanılabilir.

Bunun eklenmemesinin nedeni @Valid ek açıklamaya nedeni, zaman alan java topluluk süreci (JSR-303) kullanılarak standartlaştırılmış olması ve Spring geliştiricilerinin insanların bu işlevi daha erken kullanmalarına izin vermek istemeleridir.

Ek açıklamanın nasıl ortaya çıktığını görmek için bu jira biletine gidin .


118

Daha basit bir cevap. Hala dünyada "doğrulama grubu" ne olduğunu bilmeyenler için .

@ValidDoğrulama için Kullanım

Denetleyici:

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

Form nesnesi:

public class Account {

    @NotBlank
    private String username;

    @Email
    @NotBlank
    private String email;

}

@ValidatedDoğrulama Grubu Kullanımı
Kaynak: http://blog.codeleak.pl/2014/08/validation-groups-in-spring-mvc.html

Denetleyici:

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

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

Form nesnesi:

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;

}

Ayrıntılı olarak büyük bir sadelikle açıkladığınız için @ Zhuhang.jasper'a teşekkürler.
Gautam Tyagi

Bu tam olarak son 2 saattir aradığım şey, teşekkürler @ Zhuhang.jasper
Shady Hussein

4

Örnekte sorunun kod parçacıkları @Validve @Validatedhiçbir fark yaratmaz. Ancak @RequestBody, bir Listnesneyle not verilmişse veya notu tarafından ek açıklama yapılmış bir dize değeriyse @RequestParam, doğrulama etkili olmayacaktır.

Biz kullanabilirsiniz @Validatedçalışması için 'nin yöntemi düzeyindeki bir doğrulama olanağı. Bunu başarmak için kilit nokta @Validatedsınıfa yerleştirmektir. Bu, bahar çerçevesi arasında @Validve @Validatediçinde başka bir önemli fark olabilir .

Referans


Ek açıklamanın Listnesneler üzerinde neden bir etkisi olmadığını açıklayabilir misiniz ? Bunun gibi diğer koleksiyonlar için de işe yaramayacağını varsayıyorum Map? Belki
sorumda

1
@Theiaz Dilediğiniz gibi
Lebecca

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.