• 框架——校验框架——HibernateValidator——错误提示消息


    错误提示信息的知识点分为两部分。

    第一部分,内容。

    第二部分,配置。配置有两种方式,内置的,自定义方式,实现MessageInterpolator接口。

    1、内容

    1.1   特殊字符

    {, }, $, \为特殊字符,需要\转义。

    1.2  注解属性

    校验注解中的属性。例如@Size注解中的min,max。

    @Size(min = 2, max = 14, message = "The license '${validatedValue}' size must be greater than {min} and smaller than {max}")
    private String licensePlate;
    

    1.3  字段属性

      Bean中字段属性值,通过${validatedValue}引用,可以使用java.util.Formatter的format方法进行格式化。

    @Size(min = 2, max = 14, message = "The license '${formatter.format('%1$.2f', validatedValue)}' size must be greater than {min} and smaller than {max}")
    private String licensePlate;
    

      引入时,需要配置级别(使用默认值即可),默认级别为BEAN_PROPERTIES,它的配置方式为:

    .constraintExpressionLanguageFeatureLevel(level)
    

      其中level的值有以下几种:

    1. NONE: 不支持任何属性,表达式等。
    2. VARIABLES: 支持表达式,properties文件,formatter对象。
    3. BEAN_PROPERTIES:在VARIABLES的基础上支持${validatedValue}
    4. BEAN_METHODS: 支持引用方法相关的内容。

    2、配置

    2.1   内置

    由框架提供的配置方式本质上有两种,

    第一种,设置注解的message属性,对应第一种方式。

    第二种,根据配置文件,XX.properties,对应第二,第三,第四种方式。

    方式一,在注解中设置message属性,值为错误信息。

    @Min(value = 2, message="must be great than two")
    private int seatCount;
    

      方式二,在注解中设置message属性,值为变量的key值,根据key值在ValidationMessages.properties下查找对应的value 

    // 制造商名称
    @NotNull(message = "{manu_empty}")
    private String manufacturer;
    // 在validationMessages.properties文件中存在
    manu_empty="The manufacturer must have a value"
    

      方式三,与第二种方式类似,区别在于提供自定义的配置文件。

    Validator validator = Validation.byDefaultProvider()
            .configure()
            .messageInterpolator(
                  new ResourceBundleMessageInterpolator(
                    new PlatformResourceBundleLocator( "MyMessages" )
                  )
            )
            .buildValidatorFactory()
            .getValidator();
    

      方式四,与第三种方式相同,区别在于一次性提供多个配置文件。

    .messageInterpolator(
            new ResourceBundleMessageInterpolator(
                    new AggregateResourceBundleLocator(
                            Arrays.asList("MyMessages","MyOtherMessages")
                    )
            )
    

    2.2 自定义

      第一步,实现MessageInterpolator接口。

    public class MyMessageInterpolator implements MessageInterpolator {
    
        @Override
        public String interpolate(String messageTemplate, Context context) {
            //...
            return null;
        }
    
        @Override
        public String interpolate(String messageTemplate, Context context, Locale locale) {
            //...
            return null;
        }
    }
    

      第二步,引入自定义实现类。

    Validator validator = Validation.byDefaultProvider()
            .configure()
            .messageInterpolator( new MyMessageInterpolator() )
            .buildValidatorFactory()
            .getValidator();
    

      

  • 相关阅读:
    HTTP请求报文与响应报文
    RTTI (Run-time type information) in C++
    Advanced C++ | Virtual Copy Constructor
    Virtual Destructor
    Advanced C++ | Virtual Constructor
    What happens when more restrictive access is given to a derived class method in C++?
    Can static functions be virtual in C++?
    Virtual functions in derived classes
    Default arguments and virtual function
    Multiple Inheritance in C++
  • 原文地址:https://www.cnblogs.com/rain144576/p/16640569.html
Copyright © 2020-2023  润新知