2013-10-04 14 views
22

tôi đang làm rất nhiều xác nhận của chúng tôi với Hibernate và chú thích mùa xuân như vậy:thủ gọi mùa xuân Chú 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{} 
} 

Và sau đó trong bộ điều khiển nó được gọi trong các đối số:

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

Nhưng tôi muốn quyết định nhóm được sử dụng dựa trên một số logic trong phương pháp điều khiển. Có cách nào để gọi xác nhận theo cách thủ công không? Một cái gì đó như result = account.validate(Account.Step1.class)?

Tôi biết việc tạo lớp Validator của riêng bạn, nhưng đó là điều tôi muốn tránh, tôi muốn chỉ sử dụng các chú thích trên các biến lớp.

Trả lời

32

Đi một bước xa hơn so với Jaiwo99 trong câu trả lời của mình:

// 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 nếu bạn quan tâm.

+0

OP quy định rằng anh ta không muốn tạo một lớp Validator, nhưng gọi 'validator.validate (tài khoản, lỗi, Account.Step1.class)' từ trình xác nhận riêng biệt thuận tiện thêm lỗi vào thực thể phản hồi (nếu BindingResult không được định nghĩa trong bộ điều khiển). – Milanka

11

Đây là một mẫu mã từ 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); 

Vì vậy, có, bạn chỉ có thể nhận được một trường hợp xác nhận từ nhà máy validator và chạy xác nhận chính mình, sau đó kiểm tra để xem nếu có vi phạm hay không. Bạn có thể thấy trong số javadoc for Validator rằng nó cũng sẽ chấp nhận một nhóm các nhóm để xác thực.

Rõ ràng đây sử dụng xác nhận JSR-303 trực tiếp thay vì phải trải qua xác nhận mùa xuân, nhưng tôi tin rằng mùa xuân chú thích xác nhận sẽ sử dụng JSR-303 nếu nó tìm thấy trong classpath

+3

Có điều là, rằng nếu bạn đang sử dụng Spring MVC, bạn có thể muốn 'BindingResult'/'Errors' thay vì' ConstraintViolation's. Vì vậy, trong khi câu trả lời của bạn là chính xác, nó không phải là một phù hợp cho câu hỏi. –

6

Nếu bạn đã tất cả mọi thứ được cấu hình đúng, bạn có thể làm này:

@Autowired 
Validator validator; 

Sau đó, bạn có thể sử dụng nó để xác thực đối tượng.

1

Và cũng:

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

... 
violations = validator.validate(account); 
Các vấn đề liên quan