从bindingresult生成自己的新消息

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

我想向你咨询一下结果。看看我下面的情况。
my messages.properties存储错误消息如下

error.required=Please input {0}

我的控制器拒绝了2个字段,错误如下

bidingResult.rejectValue("field1", "error.required", new Object[]{"Field1"}, null);
bidingResult.rejectValue("field2", "error.required", new Object[]{"Filed2"}, null);

我的视图使用如下语法提取消息

<div th:each="err : ${#fields.errors('*')}" th:text="${err}"></div>

结果将显示如下2条消息

Please input Field1
Please input Field2

我的问题是我可以通过bindingresult创建一个新的messages对象来显示这样的消息吗

Please input Field1 and Field2

我想合并同一个错误并连接消息param

yshpjwxd

yshpjwxd1#

最简单的方法是在对象级别创建一个自定义验证器。从自定义注解开始:

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = BothFieldsPresentValidator.class) 
public @interface BothFieldsPresent {
      String message() default "{BothFieldsPresent}";
      Class<?>[] groups() default {};
      Class<? extends Payload>[] payload() default {};
  }

接下来,创建自定义验证器:

public class BothFieldsPresentValidator implements ConstraintValidator<BothFieldsPresent, MyObject> {

  public boolean isValid(MyObject myObject, ConstraintValidatorContext context) {

    if( myObject.getField1() == null && myObject.getField2() == null ) {
      context.disableDefaultConstraintViolation();
      context.buildConstraintViolationWithTemplate("{BothFieldsPresent}")
             .addConstraintViolation()
      return false;
    }

    return true;
  }
}

将新的自定义注解添加到 MyObject 班级:

@BothFieldsPresent
public class MyObject {
  ...
}

在控制器中,执行以下操作:

@PostMapping
public String doPost(@Valid @ModelAttribute("myObject") MyObject myObject, BindingResult bindingResult, Model model) {
  if( bindingResult.hasErrors() ) {
    return "template-name"
  }

  service.doSomething(myObject);

  return "redirect:/somewhere"
}

将此添加到 messages.properties :

BothFieldsPresent=Please input Field1 and Field2

相关问题