2013-10-04 10 views
22

robię dużo naszej walidacji z Hibernate i adnotacje Wiosna tak:Ręcznie nazwać Wiosna adnotacji Validation

public class Account { 
    @NotEmpty(groups = {Step1.class, Step2.class}) 
    private String name; 

    @NotNull(groups = {Step2.class}) 
    private Long accountNumber; 

    public interface Step1{} 
    public interface Step2{} 
} 

I wtedy w sterowniku to się nazywa w argumentach:

public String saveAccount(@ModelAttribute @Validated({Account.Step1.class}) Account account, BindingResult result) { 
    //some more code and stuff here 
    return ""; 
} 

Ale chciałbym zdecydować, która grupa jest używana w oparciu o pewną logikę w metodzie sterownika. Czy istnieje sposób ręcznego sprawdzania poprawności? Coś takiego jak result = account.validate(Account.Step1.class)?

Jestem świadomy tworzenia własnej klasy Validator, ale jest to coś, czego chcę uniknąć, wolałbym po prostu użyć adnotacji na samych zmiennych klas.

Odpowiedz

32

Idąc krok dalej niż Jaiwo99 w jego odpowiedź:

// org.springframework.validation.SmartValidator - implemented by 
//  LocalValidatorFactoryBean, which is funny as it is not a FactoryBean per se (just saying) 
@Autowired 
SmartValidator validator; 

public String saveAccount(@ModelAttribute Account account, BindingResult result) { 
    // ... custom logic 
    validator.validate(account, result, Account.Step1.class); 
    if (result.hasErrors()) { 
     // ... on binding or validation errors 
    } else { 
     // ... on no errors 
    } 
    return ""; 
} 

A mandatory link to SmartValidator JavaDoc jeśli jesteś zainteresowany.

+0

OP podał, że nie chce tworzyć klasy Validator, ale wywołanie 'validator.validate (account, errors, Account.Step1.class)' z oddzielnego walidatora wygodnie dodaje błędy do encji odpowiedzi (jeśli BindingResult nie jest zdefiniowany w kontrolerze). – Milanka

11

Oto przykładowy kod z JSR 303 spec

Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); 

Driver driver = new Driver(); 
driver.setAge(16); 
Car porsche = new Car(); 
driver.setCar(porsche); 


Set<ConstraintViolation<Driver>> violations = validator.validate(driver); 

Więc tak, można po prostu dostać instancji walidatora z fabryki weryfikatorów i uruchomić sprawdzanie siebie, a następnie sprawdzić, czy istnieją naruszenia, czy nie. Możesz zobaczyć w javadoc for Validator, że zaakceptuje również tablicę grup do sprawdzenia.

Oczywiście używa walidacji JSR-303 bezpośrednio zamiast przechodzi walidacji wiosennej, ale wierzę, wiosenne adnotacje walidacji użyje JSR-303, jeśli jest się w ścieżce klasy

+3

Chodzi o to, że jeśli używasz MVC wiosny, prawdopodobnie chcesz 'BindingResult' /' Errors' zamiast 'ConstraintViolation's. Tak więc, podczas gdy twoja odpowiedź jest poprawna, nie nadaje się do tego pytania. –

6

Jeśli wszystko poprawnie skonfigurowane, można zrobić to:

@Autowired 
Validator validator; 

Następnie można go użyć do sprawdzenia poprawności obiektu.

1

A także:

@Autowired 
@Qualifier("mvcValidator") 
Validator validator; 

... 
violations = validator.validate(account);