2013-10-04 2 views
22

Я делаю много нашей проверки с Hibernate и Spring аннотаций так:вручную называют Spring аннотаций Проверка

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

А затем в контроллере это называется в аргументах:

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

Но я хотел бы выбрать группу, используемую на основе некоторой логики в методе контроллера. Есть ли способ вызвать проверку вручную? Что-то вроде result = account.validate(Account.Step1.class)?

Я знаю о создании собственного класса Validator, но этого я хочу избежать, я бы предпочел просто использовать аннотации для самих переменных класса.

ответ

32

Переход на шаг дальше, чем Jaiwo99 в своем ответе:

// 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 ""; 
} 

И mandatory link to SmartValidator JavaDoc если вы заинтересованы.

+0

ОП указал, что он не хочет создавать класс Validator, но вызывает 'validator.validate (account, errors, Account.Step1.class)' из отдельного валидатора, удобно добавляет ошибки в объект ответа (если BindingResult не определен в контроллере). – Milanka

11

Вот пример кода из 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); 

Так что да, вы можете просто получить экземпляр валидатор от валидатора фабрики и запустить проверку самостоятельно, то проверьте, есть ли нарушение или нет. Вы можете видеть в javadoc for Validator, что он также примет массив групп для проверки.

Очевидно, что это использует проверку JSR-303 непосредственно вместо того, чтобы идти через проверку Spring, но я считаю, пружинные аннотации проверки будут использовать JSR-303, если он находится в пути к классам

+3

Дело в том, что если вы используете Spring MVC, вы, вероятно, хотите 'BindingResult' /' Errors' вместо 'ConstraintViolation's. Поэтому, пока ваш ответ правильный, это не подходит для вопроса. –

6

Если все настроено правильно, вы можете сделать это:

@Autowired 
Validator validator; 

Тогда вы можете использовать его для проверки объекта.

1

А также:

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

... 
violations = validator.validate(account); 
Смежные вопросы