2016-07-28 119 views
0

我正在研究hibernate-validator和validation-api庫,我想驗證類型爲Integer的字段名稱,當用戶使用String類型輸入時,我的問題原因。它使用null和empty。如果你曾經有過這個問題,你能告訴我解決問題的方法嗎?休眠驗證Integer字段

@Entity 
@Table(name = "shops") 
public class Shop { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    private String name; 

    @Column(name = "employees_number") 
    private Integer emplNumber; 

    // getter and setter 

} 

@Component 
public class ShopValidator implements Validator { 

    @Override 
    public boolean supports(Class<?> clazz) { 
     return Shop.class.isAssignableFrom(clazz); 
    } 

    @Override 
    public void validate(Object target, Errors errors) { 
     Shop shop = (Shop) target; 
     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "shop.name.empty"); 
     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "emplNumber", "shop.emplNumber.empty"); 
     if (!NumberUtils.isNumeric(shop.getEmplNumber().toString())) { 
      errors.rejectValue("emplNumber", "shop.emplNumber.invalid"); 
     } 
    } 

} 

public class NumberUtils { 

    public static boolean isNumeric(String isNum) { 
     try { 
      return isNum.matches("[1-9]+"); 
     } catch (NullPointerException e) { 
      return false; 
     } 
    } 
} 

Here is picture I need to validate

回答

0

嘗試@Digits@NotBlank註釋

@Entity 
@Table(name = "shops") 
public class Shop { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    private String name; 

    @Column(name = "employees_number") 
    @NotBlank(message = "{shop.name.empty}") 
    @Digits(integer=10, fraction=0, message = "{shop.emplNumber.invalid}") 
    private String emplNumber; 

    // getter and setter 
} 

http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-defineconstraints-spec

+0

的你的工作變型和註釋逐一場時方法。但在我當前的代碼中,我使用@InitBinder來驗證一個類。如果將類型更改爲字符串,則使用當前代碼完成這些代碼,不再需要添加更多代碼。問題是你有什麼辦法來驗證,但仍然保持Integer類型?因爲我希望這種類型與db中的類型映射。 – anhngoquoc

+0

'emplNumber'是'Integer',所以它不能是'String',你不能從你的表單傳遞String值。您可以將其更改爲字符串並使用'@Type'註釋。或者你可以保留它作爲'Integer',但不允許輸入任何東西,除了你的頁面上的數值和一些JS或''HTML5 – Uata

+0

也許改變類型爲String是最好的方式和適合與當前的代碼。 「在HTML5中的JS或 - >我試過這個方法,但是如果用戶禁用js或f12編輯類型屬性輸入然後提交,它仍然會導致問題。這只是一個簡單的項目,但如果客戶爲我們分配了一個項目並且他們只想開發更多項目,他們不希望編輯的東西存在。或者他們輸入的測試人員以他們想要的形式輸入,這會繼續引發問題。也許我很複雜:)。感謝您的幫助。 – anhngoquoc