2016-07-28 90 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