spring mvc验证和eleaf-validating integer字段

cu6pst1q  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(308)

我正在将.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数据类型来烦扰用户呢?
如有任何建议,我将不胜感激。

uqxowvwt

uqxowvwt1#

如果您想从注解中获得自定义行为,则需要为该注解定义自己的constriant注解和验证器。
以下是自定义约束注解的基本示例:

@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = CheckCalculationTypeValidator.class)
@Documented
public @interface CheckCalculationType {

   String message() default "calculation_type shall be not NULL if status = active";

   Class<?>[] groups() default {};

   Class<? extends Payload>[] payload() default {};
}

和验证程序:

public class CheckCalculationTypeValidator implements ConstraintValidator<CheckCalculationType, RequestDto> {

    @Override
    public boolean isValid(RequestDto dto, ConstraintValidatorContext constraintValidatorContext) {
        if (dto == null) {
            return true;
        }
        return !(Status.ACTIVE.equals(dto.getStatus()) && dto.getCalculationType() == null);
    }

    @Override
    public void initialize(CheckCalculationType constraintAnnotation) {
        // NOP
    }
}

hibernate验证程序所需的依赖关系:

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.2.Final</version>
</dependency>

相关问题