2012-02-29 26 views
9

Trong bean được quản lý, tôi có thuộc tính của kiểu int.Làm cách nào để xác thực các trường số với validateRegex trong một trang JSF?

@ManagedBean 
@SessionScoped 
public class Nacharbeit implements Serializable { 

private int number; 

Trong trang JSF tôi cố gắng để xác nhận tài sản này cho 6 chữ số đầu vào số chỉ

   <h:inputText id="number" 
         label="Auftragsnummer" 
         value="#{myController.nacharbeit.number}" 
         required="true"> 
       <f:validateRegex pattern="(^[1-9]{6}$)" /> 
      </h:inputText> 

On runtime tôi nhận được một ngoại lệ:

javax.servlet.ServletException: java.lang.Integer cannot be cast to java.lang.String 

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 

là regex sai? Hoặc là ValidateRegex chỉ dành cho Strings?

Trả lời

24

<f:validateRegex> chỉ được sử dụng trên String thuộc tính. Nhưng bạn đã có một tài sản int mà JSF đã chuyển đổi giá trị được gửi String thành Integer trước khi xác thực. Điều này giải thích ngoại lệ bạn đang thấy.

Nhưng vì bạn đã sử dụng thuộc tính int, bạn sẽ gặp phải lỗi chuyển đổi khi bạn nhập không phải chữ số. Thông báo lỗi chuyển đổi có thể được định cấu hình theo thuộc tính converterMessage. Vì vậy, bạn không cần phải sử dụng regex cả.

Theo yêu cầu chức năng cụ thể, bạn có vẻ muốn xác thực độ dài tối thiểu/tối đa. Cho rằng bạn nên sử dụng <f:validateLength> để thay thế. Sử dụng điều này kết hợp với thuộc tính maxlength để người dùng cuối sẽ không thể nhập nhiều hơn 6 ký tự.

<h:inputText value="#{bean.number}" maxlength="6"> 
    <f:validateLength minimum="6" maximum="6" /> 
</h:inputText> 

Bạn có thể định cấu hình thông báo lỗi xác thực bằng cách validatorMessage bằng cách này. Vì vậy, tất cả đều có thể trông giống như sau:

<h:inputText value="#{bean.number}" maxlength="6" 
    converterMessage="Please enter digits only." 
    validatorMessage="Please enter 6 digits."> 
    <f:validateLength minimum="6" maximum="6" /> 
</h:inputText> 
Các vấn đề liên quan