SORU
27 AĞUSTOS 2012, PAZARTESİ


Doğrulama gerçekleştirmek için Nasıl ?Spring MVC :

Kullanıcı giriş formu doğrulama gerçekleştirmek için en temiz ve en iyi yolu nedir bilmek istiyorum. Bazı geliştiriciler org uygulamak gördüm.springframework.doğrulama.Doğrulayıcı. Bu konuda bir soru : bir sınıf doğrular gördüm. Sınıf el ile kullanıcı giriş değerleri ile dolu olmak, ve sonra doğrulayıcı geçirilen var mı?

Kullanıcı girişini doğrulamak için en temiz ve en iyi yolu hakkında kafam karıştı. Ben isteği kullanarak ilgili geleneksel yöntem.() getParameter ve sonra el ile boşluk için kontrol, ama benim Denetleyicisi tüm doğrulama yapmak istemiyorum. Bu alanda bazı iyi bir tavsiye büyük takdir edilecektir. Bu uygulamada Hazırda kullanıyorum.

CEVAP
27 AĞUSTOS 2012, PAZARTESİ


Spring MVC ile doğrulama gerçekleştirmek için 3 farklı yolu vardır : kullanarak açıklama, el ile, ya da her ikisinin bir karışımı. "En temiz ve en iyi bir şekilde" doğrulamak için, ama muhtemelen proje/sorun/içerik daha iyi uyan bir tane var. bir benzersiz yok

Hadi bir Kullanıcı var :

public class User {

    private String name;

    ...

}

Yöntem 1 :Eğer Bahar 3 varsa.x ve basit doğrulama, javax.validation.constraints ek açıklama (genel amaçlı-303 notları olarak da bilinir) kullanın.

public class User {

    @NotNull
    private String name;

    ...

}

İhtiyacınız olacak bir genel amaçlı-303 sağlayıcısı senin librairies, gibi Hibernate Validator kim referans uygulama (bu kütüphane ile bir ilgisi yok, veritabanları ve ilişkisel eşleme, sadece yok doğrulama :-).

Sizin Denetleyicisi gibi bir şey olurdu o zaman :

@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
    }
}

@Geçerli dikkat : eğer kullanıcı bir boş isim olursa, sonuç.() hasErrors doğru olacaktır.

Yöntem 2 :Eğer karmaşık doğrulama (gibi büyük bir iş mantığı doğrulama, birçok alanda koşullu doğrulama, vb.), varsa ya nedense yöntem 1'i kullanın, manuel doğrulama kullanamazsınız. Doğrulama mantık denetleyicisinin kod ayırmak için iyi bir uygulamadır. Doğrulama sınıfı(es) sıfırdan yaratmak değil, bir Bahar kullanışlı org.springframework.validation.Validator arayüz (Bahar 2'den beri) sağlar.

Hadi olduğunu varsayalım

public class User {

    private String name;

    private Integer birthYear;
    private User responsibleUser;
    ...

}

ve bazı "kullanıcı yaş null olmamalı responsibleUser 18, altında ve responsibleUser yaşı 21 üzerinde olmalıdır." gibi doğrulama : karmaşık yapmak istiyorum

Böyle bir şey yapmayacaksın

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

    }

}

Sizin denetleyicisi olurdu o zaman :

@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
        }
}

Eğer doğrulama hataları varsa, sonuç.() hasErrors doğru olacaktır.

Not : ayrıca "Ciltçi.kumandayı @İnitBinder bir yöntem doğrulayıcı ayarlayabilirsiniz(...) setValidator" bu durumda, yöntem 1 ve 2'nin karışımı bir kullanım varsayılan doğrulayıcı değiştirin, çünkü mümkün olmaz (). Ya denetleyicisi varsayılan kurucuyu bunun örneğini. Ya da bir @Component/@Hizmet UserValidator sana enjekte (@Autowired) denetleyici : çok yararlı, çünkü en elemanları olan tek birim test alay daha kolay olur senin doğrulayıcı diye adlandır diğer Bahar bileşenleri.

Yöntem 3 : Neden her iki yöntem bir arada kullanarak değil mi? Doğrulamak basit şeyler, "name" özniteliği, ek açıklamalar (hızlı, kısa ve daha okunabilir). Katılmak için ağır doğrulamalarını saat özel karmaşık doğrulama ek açıklamalar kod alır, ya da olası ek açıklamalar kullanmak için değil sadece! Eski bir proje yaptım, bir çekicilik, hızlı ve kolay gibi çalıştı.

Uyarı :hata olmamalıdırdoğrulama kullanmaiçinözel durum işleme. Bunları kullanmak için zaman bilmek Read this post.

Referanslar :

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MrSuicideSheep

    MrSuicideShe

    9 NİSAN 2010
  • stokelycalm

    stokelycalm

    28 Aralık 2010
  • Thom Hall

    Thom Hall

    24 Kasım 2006