【问题标题】:Spring MVC Form Hibernate Validator : Cross parameter constraint has no cross parameter validatorSpring MVC Form Hibernate Validator:交叉参数约束没有交叉参数验证器
【发布时间】:2013-08-11 16:54:57
【问题描述】:

这是我的表格

public class TaskForm extends WebForm<TaskModel> {

    public TaskForm(){
        this(new TaskModel());
    }

    public TaskForm(TaskModel form) {
        super(form);
    }


    @NotNull
    @NotEmpty
    public void setName(String taskName){
        target.setTaskName(taskName);
    }


    @NotNull
    @NotEmpty
    public void setDescription(String description){
        target.setDescription(description);
    }

    public void setStartDate(DateTime startDate){
        target.setStartDate(startDate);
    }

    public DateTime getStartDate(){
        return target.getStartDate();
    }

    @DateTimeFormat(pattern = "MM/dd/yyyy")
    public void setEndDate(DateTime endDate){
        target.setEndDate(endDate);
    }

    public DateTime getEndDate(){
        return target.getEndDate();
    }

    public String getName(){
        return target.getTaskName();
    }

    public String getDescription(){
        return target.getDescription();
    }
}

当我提交表单时,它抛出了一个异常。

HTTP Status 500 - Request processing failed; nested exception is javax.validation.ConstraintDefinitionException: HV000154: Cross parameter constraint org.hibernate.validator.constraints.NotEmpty has no cross-parameter validator.

是什么导致了这个问题?

【问题讨论】:

    标签: forms hibernate spring-mvc hibernate-validator


    【解决方案1】:

    尝试在 getter 中移动您的 @NotNull 和 @NotEmpty 验证约束。像这样改变你的表格

    public class TaskForm extends WebForm<TaskModel> {
    
        public TaskForm(){
            this(new TaskModel());
        }
    
        public TaskForm(TaskModel form) {
            super(form);
        }
    
        public void setName(String taskName){
            target.setTaskName(taskName);
        }
    
    
    
        public void setDescription(String description){
            target.setDescription(description);
        }
    
        public void setStartDate(DateTime startDate){
            target.setStartDate(startDate);
        }
    
        public DateTime getStartDate(){
            return target.getStartDate();
        }
    
        //@DateTimeFormat(pattern = "MM/dd/yyyy")
        public void setEndDate(DateTime endDate){
            target.setEndDate(endDate);
        }
    
        public DateTime getEndDate(){
            return target.getEndDate();
        }
    
        @NotNull
        @NotEmpty
        public String getName(){
            return target.getTaskName();
        }
    
        @NotNull
        @NotEmpty
        public String getDescription(){
            return target.getDescription();
        }
    }
    

    【讨论】:

      【解决方案2】:

      Bean 约束必须在某个类型的字段或 getter 上。如果将它们放在返回 void 的 setter 上,验证引擎会假定交叉参数约束(方法验证)。移动约束将解决问题。

      【讨论】:

      • 我在想验证引擎期望从放置约束的方法中返回值,在他的例子中,他将它放在 void 方法中,这也是它抛出的原因之一例外。
      • 对于方法验证,对非 getter 方法的约束可以是返回值约束,也可以是所谓的交叉参数约束,可用于验证所有方法参数及其相互关系。由于示例中的方法返回 void,因此验证引擎假定交叉参数约束并尝试找到它无法找到的匹配约束验证器。因此出现错误。
      • 有任何相关文档吗?我还没有看到关于验证约束的描述或规定
      • 当然,检查 Bean 验证规范 beanvalidation.org/1.1/spec/…。请注意,这是 Bean Validation 1.1。 Bean Validation 1.0 没有指定方法验证。那里的约束将被忽略。
      猜你喜欢
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 2012-08-21
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 2018-10-22
      相关资源
      最近更新 更多