2011-09-26 8 views
7

tôi đang cố gắng để làm cho nhiều xác nhận một trong một lĩnh vựcNhiều xác nhận trên một lĩnh vực với xác đậu JSF

@NotBlank(message = "{name.required}") 
    @Max(value = 25, message = "{long.value}") 
    public String name; 

JSF:

<h:inputText id="name" value="#{person.name}" size="20"> 
</h:inputText> 
<h:message for="name" style="color:red" /> 

nhưng khi tôi rời sân trống, nó cho thấy cả hai lỗi tin nhắn.

bất kỳ ý tưởng nào về cách xử lý cả hai trường hợp, xác thực độ dài trống và độ dài tối đa một cách độc lập.

+0

thật lạ lùng, tôi không biết tại sao, nhưng khi tôi sử dụng @Size và cho nó tối đa, mọi thứ hoạt động như mong đợi, bất kỳ ý tưởng nào? –

+1

'@ Size' và' @ Max' không giống nhau. '@ Size' xác nhận độ dài của giá trị chuỗi đầu vào. '@ Max' xác nhận giá trị số của bất kỳ giá trị đầu vào số nào. Ví dụ. 26 sẽ không truyền vào '@Max (25)'. – BalusC

Trả lời

5

Nếu cấu hình JSF 2 bạn giải thích giá trị nộp rỗng như "" và không null thì:

Các @NotBlank validator trả false vì chú thích chuỗi của bạn là trống rỗng.

Trình xác thực @Max trả về false vì theo triển khai ngủ đông (tôi đoán bạn đang sử dụng cơ sở triển khai ngủ đông trên các bài đăng trước đó của bạn).

public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { 
     //null values are valid 
     if (value == null) { 
      return true; 
     } 
     try { 
      return new BigDecimal(value).compareTo(BigDecimal.valueOf(maxValue)) != 1; 
     } 
     catch (NumberFormatException nfe) { 
      return false; 
     } 
    } 

Trong trường hợp của bạn String tham số value chứa một giá trị rỗng ("") và BigDecimal (String) constructor ném một ngoại lệ và sau đó trình xác thực sẽ trả false.

Bạn có hai giải pháp khả thi:

+0

Rất thú vị! Trong trường hợp đó, OP cũng có thể sử dụng '@ NotNull' thay cho' @ NotBlank' của hibernate-impl cụ thể. – BalusC