JSR-303多正则校验及多提示消息配置问题咨询
解决方案:用@Pattern.List区分全空格与特殊字符校验提示
要实现全空格时显示专属提示,同时保留特殊字符校验的不同提示,你可以通过@Pattern.List定义两个正则校验规则,分别对应两种违规场景,并在messages.properties中为每个规则配置独立的消息。具体步骤如下:
1. 更新Person类的校验注解
保留@NotNull处理null值,用@Pattern.List替代原来的@NotEmpty和单个@Pattern,添加两个@Pattern规则:
- 第一个规则匹配全空格(包括空串),触发“姓名不能为空白”提示
- 第二个规则匹配禁止的特殊字符,触发原来的“Invalid name”提示
代码示例:
public class Person { @NotNull(message = "{person.name.notnull}") // 可选:为null值配置单独提示 @Pattern.List({ @Pattern( regexp = "^\\s*$", message = "{person.name.blank}" ), @Pattern( regexp = "^[^_*!$^|\\:;&<>\"']*$", // 修正原正则转义:将<>替换为实际的<> message = "{person.name.specialcharacter}" ) }) private String name; // getter、setter 省略 }
2. 配置messages.properties
为每个校验规则的message键配置对应的提示文本:
# 处理null值的提示(可选) person.name.notnull=姓名不能为空 # 全空格/空串的提示 person.name.blank=姓名不能为空白 # 特殊字符的提示 person.name.specialcharacter=Invalid name
关键说明
- 正则解释:
^\\s*$:匹配任意数量的空白字符(包括0个,即空串),直接覆盖原来@NotEmpty的校验场景- 第二个正则修正了原表达式的转义问题,把HTML实体
<>换成实际的<>,确保能正确匹配这些特殊字符
- 校验逻辑:JSR-303会依次执行
@Pattern.List中的规则,只要有一个规则匹配违规场景,就会抛出对应的提示。用户输入全空格时,第一个规则优先触发,显示“姓名不能为空白”;输入包含特殊字符的非空白内容时,第二个规则触发,显示“Invalid name” - 保留@NotNull:正则规则无法处理null值,所以必须保留
@NotNull来校验字段为null的场景
内容的提问来源于stack exchange,提问作者Saakshi Aggarwal
相关产品推荐
相关产品推荐

