2013-07-04 10 views
12

Bazı alanlarda hazırda bekleme en doğrulama ek açıklamanın bulunduğu bir sınıf varİlkbaharda @Valid parametresiyle @RequestMethod yönteminde çalışan aynı doğrulayıcıyı nasıl programlayabilirim?

public class MyClass { 

    Long id; 

    @NotEmpty 
    @Size(min = 4, max = 50) 
    String machineName; 

    @NotEmpty 
    @Size(min = 4, max = 50) 
    String humanName; 

    // Getters, setters, etc… 
} 

(vb @NotNull ve @Size(min = 4, max = 50) ... gibi) ben de bir JSON API gibi davranan özel bir kontrolör ve bir JSON deserializer olduğunu API yöntemleri çağrıldığında MyClass nesneleri oluşturur.

@RequestMapping(method = RequestMethod.POST) 
public long createMyObject(@RequestBody @Valid MyClass newObj) { 
    // Create the object in the database 
    return newObj.getId(); 
} 

ve ben createMyObject içinde @Valid kullanabilirsiniz, ben kullanamıyorum varolan nesneyi

@RequestMapping(method = RequestMethod.PUT) 
public void updateMyObject(@RequestBody MyClass updatedObj) { 
    MyClass existingObj = // Get existing obj from DB by updatedObj.getId(); 

    // Do some secondary validation, such as making sure that a specific 
    // field remains unchanged compared to the existing instance 
    if (existingObj.getMachineName() != null && 
      !existingObj.getMachineName().equals(updatedObj.getMachineName())) { 
     throw new CannotChangeMachineNameException(); 
    } 
    else { 
     updatedObj.setMachineName(existingObj.getMachineName()); 
    } 

    // [HERE IS WHERE I WANT THE MAGIC TO HAPPEN] 

    // Save updatedObj to the database 
} 

günceller başka bir yöntemi: benim özel denetleyicisi ben bu türde yeni bir nesne oluşturmak için bir yöntem var updateMyObject yılında bizim API uygulama makineAdı değişmeden kalmasını gerektirdiği için - kullanıcıların ya dışlayan tamamen machineName veya veritabanında mevcut aynı değerle doldurmak JSON nesnesi ile API çağırabilirsiniz *

.

Güncelleştirilmiş nesneyi veritabanına kaydetmeden önce @Valid ek açıklamasını içeren aynı doğrulayıcıyı çağırmak istiyorum. Bu doğrulayıcıyı nasıl bulabilir ve kullanabilirim?

+1

Sana doğrulama grupları kullanabilirsiniz düşünüyorum. MachineName'de (@ ve eski ve yeni isimleri karşılaştıran özel bir doğrulayıcı) '@ NotNull' dışındaki tüm doğrulamaları varsayılan grupta bulun ve kalan geçerlilik denetleyicisinin' Güncelle 'grubunda olmasını sağlayın. Her iki grubu 'updateMyObject' yönteminde kullanın. Bkz. Http://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html/chapter-groups.html#d0e2595 –

cevap

6

Hiçbir şey denetleyici yöntemlerinde @Valid kullanmanız gerektiğini söylemez. Neden @Valid olarak ek açıklama eklediğiniz bir parametreyi kabul eden bir doğrulama yöntemi yapmayın, ardından aynı parametreyi döndürün. Bunun gibi

: Alternatif hazırda bekletme en doğrulama paketi kullanmak olacak gibi

public Book validateBook(@Valid Book book) { 
    return book; 
} 

görünüyor. Here's it's documentation.

Temel olarak, bir ValidationFactory bir Validator almak ve sonra böyle doğrulayıcı kullanabilirsiniz:

@Test 
    public void manufacturerIsNull() { 
     Car car = new Car(null, "DD-AB-123", 4); 

     Set<ConstraintViolation<Car>> constraintViolations = 
      validator.validate(car); 

     assertEquals(1, constraintViolations.size()); 
     assertEquals("may not be null", constraintViolations.iterator().next().getMessage()); 
} 
+1

Teşekkürler! .. (UpdatedObj)() Set > hatalar = Validation.buildDefaultValidatorFactory getValidator() doğrulamak: Ben ikinci yönteme benzer bir şey yaptı, ilk yöntem işe yaramadı - Bu beni cevaba yeterince yakın yol // Bunu işaret ettiğin belgelerden aldım – daniel

İlgili konular