【问题标题】:Setting Custom Field Name and Code设置自定义字段名称和代码
【发布时间】:2015-08-25 19:26:40
【问题描述】:

我正在尝试在我的 Spring 应用程序中使用 Bean Validation 进行验证。我在我的 bean 中定义了以下字段 -

@NotNull(message = "CUSTOMERROR-1000")
private String firstName;

在这里,我在属性文件中将 CUSTOMERROR-1000 定义为“必填字段”。在我的 ControllerAdvice 类中,我可以使用以下代码检索详细信息:

getBindingResult().getFieldError().getField()
getBindingResult().getFieldError().getCode()
getBindingResult().getFieldError().getDefaultMessage()

在这里,我将字段名称设为 firstName。有没有办法注释字段并将值设置为“名字”?同样有没有办法通过注解设置代码值?

【问题讨论】:

  • 我在 bean 中注释了字段 (firstName),以便使用 JSR-303 验证。使用这一行 "getBindingResult().getFieldError().getField()" ,我可以获得字段的名称,即 firstName。我可以使用这一行“getBindingResult().getFieldError().getDefaultMessage()”获取默认消息。但是,有没有一种方法可以传递类似于传递默认消息的客户错误代码。例如:@NotNull(code="ERR-CUST-01")。我还想传递“First Name”而不是获取字段名称“firstName”。例如:@NotNull(label="First Name").
  • 我想检查自定义字段名称和错误代码值是否可以使用一些注释设置并在将错误返回给消费者时检索。
  • 您是否正在专门寻找仅注释方法?
  • 是的,我更喜欢注释。任何其他标准方法也会有所帮助。

标签: java spring jakarta-ee bean-validation spring-validator


【解决方案1】:

为此,您需要创建自己的约束。您可以添加其他属性、标签、错误代码等,为它们设置值并使用它们。见:http://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html/validator-customconstraints.html#validator-customconstraints-compound

您可以像这样定义错误消息: Error code: {errorCode} - {label} is mandatory

【讨论】:

  • 自定义约束将能够处理您想要的任何必要的自定义验证属性。此外,根据对他们的属性文件的提及,他们可能希望查看Validation Message Interpolation 以进行自定义消息构造。
  • 嗯,这绝对是我的选择,我猜他使用相同的道具。对于多个字段并想要一种自定义方式,例如添加字段名称等。
【解决方案2】:

最简单的方法 (IMO) 似乎仍然需要大量工作才能获得微不足道的 (IMO) 好处。 getFieldError 的结果由 Validator 提供。知道了这一点,您可以为您的DataBinder 提供自定义验证器。您的验证器可能如下所示:

  1. 首先定义你的自定义验证器

    public class FirstNameValidator implements Validator{
    
         public boolean supports(Class clazz) {
             return YourClass.class.equals(clazz);
         }
    
         public void validate(Object obj, Errors e) {
             if(obj != null){
                YourClass theObj = (YourClass)obj;
                   if(theObj.getFirstName() == null || theObj.getFirstName().trim()==""){
                      e.rejectValue("First Name","CUSTOMERROR-1000");
                   }
          }
    
       }
    

    }

  2. 之后,您现在使用上下文的数据绑定器注册您的自定义验证器(我假设您在此处运行 Spring MVC):

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.addValidators(new FirstNameValidator());
    }
    

这将确保您获得所需格式的名称。同样,对于一些花哨的文本,需要大量输入(基于注释的方法同样长,需要更多输入以支持注释)。

【讨论】:

    猜你喜欢
    • 2018-04-17
    • 1970-01-01
    • 2019-04-18
    • 2014-06-13
    • 1970-01-01
    • 2011-02-01
    • 2016-02-05
    • 2019-01-01
    • 2017-03-15
    相关资源
    最近更新 更多