我正在将.net项目移到SpringBoot。所以问题是如何在spring中正确验证整数字段。我有一个带有整数字段的实体:
@Entity
@Table(name = "tb_employee")
public class EmployeeDev {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "empl_id")
private int emplId;
@Range(min = 10, max = 50, message="Numbers only between 10 and 50")
@Column(name = "default_vacation_days", nullable = true)
private Integer defaultVacationDays;
... 以及捕捉错误的控制器:
// update employee
@PostMapping("/edit")
public String showFormForUpdate(@Valid @ModelAttribute("employee") EmployeeDev employee, Errors errors,
RedirectAttributes redirectAttributes,
Model theModel) {
if (null != errors && errors.getErrorCount() > 0) {
List<ObjectError> errs = errors.getAllErrors();
String errMsg = "";
for (ObjectError e :errs)
errMsg += e.getDefaultMessage();
theModel.addAttribute("message", "Employee Edit failed. " + errMsg );
theModel.addAttribute("alertClass", "alert-danger");
return "employeesdev/employee-form-edit";
}
现在的问题是,当我在default vacation days字段中键入超出范围的任何数字时,它将显示正确的验证消息:数字仅在10到50之间。
但是,如果我尝试插入类似1a(可能是用户输入错误)的内容,我会收到以下消息:无法将java.lang.string类型的属性值转换为属性defaultvacationdays所需的java.lang.integer类型;嵌套异常为java.lang.numberformatexception:对于输入字符串:“1a”
我知道这是正确的消息,但我讨厌向用户显示这样的消息。我更希望只显示“10到50之间的数字”,而不是数据类型转换问题。为什么要用java数据类型来烦扰用户呢?
如有任何建议,我将不胜感激。
1条答案
按热度按时间uqxowvwt1#
如果您想从注解中获得自定义行为,则需要为该注解定义自己的constriant注解和验证器。
以下是自定义约束注解的基本示例:
和验证程序:
hibernate验证程序所需的依赖关系: