自定义约束验证器注解@Postcode与其他注解结合使用咨询
如何将自定义
@Postcode注解与@NotEmpty等Bean Validation注解结合使用 没问题!你完全可以直接在同一个字段上同时使用@NotEmpty和你的自定义@Postcode注解——Bean Validation规范本身就支持在单个元素上叠加多个验证约束,它们会独立执行各自的校验逻辑。
完整的自定义@Postcode注解代码
首先先确认你的自定义注解代码是完整的(这里帮你补全了必要的导入):
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Documented @Constraint(validatedBy = PostcodeValidator.class) @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface Postcode { String message() default "not a well-formed postcode"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
对应的验证器实现(示例)
为了让注解生效,你需要编写PostcodeValidator类,这里给一个简单的邮编格式验证示例(可以根据你的实际需求调整正则规则):
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.regex.Pattern; public class PostcodeValidator implements ConstraintValidator<Postcode, String> { // 示例:匹配中国内地邮编的正则 private static final Pattern CHINA_POSTCODE_PATTERN = Pattern.compile("^[1-9]\\d{5}$"); @Override public boolean isValid(String postcode, ConstraintValidatorContext context) { // 空值校验交给@NotEmpty处理,这里只验证格式 if (postcode == null || postcode.isBlank()) { return true; } return CHINA_POSTCODE_PATTERN.matcher(postcode).matches(); } }
与@NotEmpty结合使用的实体类示例
现在你可以在实体字段上直接叠加两个注解:
import javax.validation.constraints.NotEmpty; public class UserAddress { // 先校验非空,再校验格式 @NotEmpty(message = "Postcode cannot be empty or blank") @Postcode(message = "Please enter a valid postcode") private final String postcode; // 构造函数、Getter等 public UserAddress(String postcode) { this.postcode = postcode; } public String getPostcode() { return postcode; } }
验证逻辑说明
当你对UserAddress实例执行Bean Validation时:
@NotEmpty会优先校验字段是否为空/全空白字符,如果不满足,直接返回对应的错误信息;- 如果空值校验通过,才会触发
@Postcode的格式验证,检查邮编是否符合你定义的规则。
两个注解的校验是独立的,只要有一个不满足,整个字段的验证就会失败。
内容的提问来源于stack exchange,提问作者dapperwaterbuffalo
相关产品推荐
相关产品推荐

