2012-02-13 38 views
6

Tôi có biểu mẫu có chứa một số nút radiocheck-boxes. Bất cứ khi nào người dùng chọn/bỏ chọn radio button hoặc check-box một số trường nhập khác được bật/tắt.
Tôi muốn thêm xác thực chỉ cho các trường được bật khi người dùng gửi biểu mẫu. Các trường bị vô hiệu hóa tại thời điểm gửi sẽ không được xem xét để xác thực.Xác thực có điều kiện trong Mùa xuân

Tôi không muốn thêm điều này vào xác thực phía khách hàng. Có cách nào tốt hơn/dễ dàng để thực hiện xác thực có điều kiện trong Spring 3.0 thay vì thêm nhiều if vào trình xác thực không?

Cảm ơn!

Trả lời

3

Khi cánh đồng bị vô hiệu hóa họ đang chuyển để điều khiển là null. Tôi muốn thêm xác thực sẽ cho phép null tức là trường bị tắt hoặc trường not blank tức là trường trống nhưng được bật.
Vì vậy, tôi đã tạo chú thích tùy chỉnh NotBlankOrNull sẽ cho phép null và các chuỗi không trống cũng sẽ chú ý đến các khoảng trống.
Đây là Chú tôi

@Documented 
@Constraint(validatedBy = { NotBlankOrNullValidator.class }) 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
public @interface NotBlankOrNull { 
    String message() default "{org.hibernate.validator.constraints.NotBlankOrNull.message}"; 

    Class<?>[] groups() default { }; 

    Class<? extends Payload>[] payload() default { }; 
} 

Validator lớp

public class NotBlankOrNullValidator implements ConstraintValidator<NotBlankOrNull, String> { 

    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 
     if (s == null) { 
      return true; 
     } 
     return s.trim().length() > 0; 
    } 

    @Override 
    public void initialize(NotBlankOrNull constraint) { 

    } 
} 

Tôi cũng đã cập nhật thêm chi tiết về site tôi.

8

Nếu bạn sử dụng xác thực Bean JSR 303 thì bạn có thể sử dụng validation groups (groups) cho việc này.

Giả sử bạn có đầu vào của người dùng này, chứa hai phần. Hai boolean cho biết các phần được bật hay tắt. (Tất nhiên bạn có thể sử dụng các chú thích hữu ích hơn @NotNull)

public class UserInput { 
    boolean sectionAEnabled; 
    boolean sectionBEnabled; 

    @NotNull(groups=SectionA.class) 
    String someSectionAInput; 

    @NotNull(groups=SectionA.class) 
    String someOtherSectionAInput; 

    @NotNull(groups=SectionB.class) 
    String someSectionBInput; 

    Getter and Setter 
} 

Bạn cần hai Giao diện cho nhóm. Chúng chỉ hoạt động như điểm đánh dấu.

public interface SectionA{} 

public interface SectionB{} 

Since Spring 3.1 bạn có thể sử dụng chú thích mùa xuân @Validated (thay vì @Validate) trong phương pháp điều khiển của bạn để kích hoạt xác nhận:

@RequestMapping... 
public void controllerMethod(
     @Validated({SectionGroupA.class}) UserInput userInput, 
     BindingResult binding, ...){...} 

Trước khi mùa xuân 3,1 không có cách nào để xác định nhóm xác nhận cần được sử dụng để xác thực (vì @Validated không tồn tại và @Validate không có thuộc tính nhóm), vì vậy bạn cần bắt đầu xác thực bằng ha nd viết mã: Đây là một ví dụ làm thế nào để kích hoạt xác nhận trong sự phụ thuộc vào phần phù thủy được kích hoạt trong mùa xuân 3.0.

@RequestMapping... 
public void controllerMethod(UserInput userInput,...){ 

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

    List<Class<?>> groups = new ArrayList<Class<?>>(); 
    groups.add(javax.validation.groups.Default.class); //Always validate default 
    if (userInput.isSectionAEnabled) { 
    groups.add(SectionA.class); 
    } 
    if (userInput.isSectionBEnabled) { 
    groups.add(SectionB.class); 
    } 
    Set<ConstraintViolation<UserInput>> validationResult = 
    validator.validate(userInput, groups.toArray(new Class[0])); 

    if(validationResult.isEmpty()) { 
    ... 
    } else { 
    ... 
    } 
} 

(BTW: Đối với các giải pháp Xuân 3.0, nó cũng có thể để cho mùa xuân tiêm validator:

@Inject javax.validation.Validator validator 

<mvc:annotation-driven validator="validator"/> 

<bean id="validator" 
     class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
     <property name="validationMessageSource" ref="messageSource" /> 
</bean> 

)

+0

Dường như một đề xuất thực sự tốt. Chỉ cần tự hỏi làm thế nào để áp dụng điều này cho các lĩnh vực hiện diện trong DTO. Tôi có vài lĩnh vực mà không có mặt trong bean/miền objecct nhưng hiện nay trên DTO và tôi muốn thêm xác nhận cho họ cũng có. – xyz

+0

Bạn có thể đặt anavation javax.validation này (NotNull, ...) trên các trường của lớp rất, Entity DTO, ... Trong ví dụ trên, UserInput phải là một DTO – Ralph

Các vấn đề liên quan