万州网站制作,如何注册公司需要多少资金,上海网站建设 迈若,企业信息系统架构在上一教程中#xff0c;我展示了如何使用注释来验证表单 。 这对于简单的验证非常有用#xff0c;但是最终#xff0c;您需要验证一些现成的注释中没有的自定义规则。 例如#xff0c;如果您需要根据输入的出生日期来验证用户已超过21岁#xff0c;或者可能需要验证用户的… 在上一教程中我展示了如何使用注释来验证表单 。 这对于简单的验证非常有用但是最终您需要验证一些现成的注释中没有的自定义规则。 例如如果您需要根据输入的出生日期来验证用户已超过21岁或者可能需要验证用户的电话区号在美国内布拉斯加州该怎么办。 本教程包含完整的源代码将显示如何创建自定义验证注释您可以在上一教程中探讨的JSR-303和Hibernate Validator注释中使用这些注释。 如果您想继续可以在GitHub上获取本教程的代码。 对于此示例假设我们有一个带有电话号码字段和生日日期字段的表单并且我们要验证电话号码是否有效简单检查格式以及该用户出生于1989年。支持这些的现成的注释据我所知因此我们将编写自定义验证注释然后可以重复使用它们就像内置的JSR-303一样。 完成后我们将注释应用于表单对象如下所示 public class Subscriber {...Phoneprivate String phone;Year(1989)private Date birthday;// getters setters ...} 让我们开始使用Phone批注。 我们将创建两个类 Phone 即批注和PhoneConstraintValidator其中包含验证逻辑。 第一步是创建Phone注释类 Documented
Constraint(validatedBy PhoneConstraintValidator.class)
Target( { ElementType.METHOD, ElementType.FIELD })
Retention(RetentionPolicy.RUNTIME)
public interface Phone {String message() default {Phone};Class?[] groups() default {};Class? extends Payload[] payload() default {};} 上面的代码大部分只是样板。 JSR-303规范要求使用批注中的三种方法。 如果我们的注释接受了任何参数那么我们将在那里定义为方法。 我们将在本教程后面的下一个批注中看到这一点。 上面的类中最重要的部分是该类上的Constraint批注该批注指定我们将使用PhoneConstraintValidator类进行验证逻辑。 message()方法定义如何解析消息。 通过指定“ {Phone}”我们可以使用Phone键覆盖Spring资源束中的消息有关消息的详细信息请参见我的其他验证教程 。 现在我们定义约束验证器 public class PhoneConstraintValidator implements ConstraintValidatorPhone, String {Overridepublic void initialize(Phone phone) { }Overridepublic boolean isValid(String phoneField, ConstraintValidatorContext cxt) {if(phoneField null) {return false;}return phoneField.matches([0-9()-\.]*);}} 让我们看一下上面的代码。 超类的模板化类型有两种类型它支持的注释的类型和它验证的属性的类型在此示例中为PhoneString。 “ initialize”方法在此处为空但可用于保存注释中的数据如下面定义其他注释时所见。 最后实际的逻辑发生在“ isValid”方法中。 字段值作为第一个参数传入我们在这里进行验证。 如您所见我只是在验证电话号码仅包含数字括号或破折号。 就是这个注解 现在可以在字段上使用批注如上面在我们的表单对象上所示。 现在让我们做第二个注释。 这个有点人为的-我们将验证用户的生日是在1989年。不过将来我们可能需要验证日期在其他年份因此我们而不是创建用于验证年份为1989年的注释。将使用一个参数来指定要验证的年份。 用法示例 Year(1989)
private Date birthDate; 现在注释 Documented
Constraint(validatedBy YearConstraintValidator.class)
Target( { ElementType.METHOD, ElementType.FIELD })
Retention(RetentionPolicy.RUNTIME)
public interface Year {int value();String message() default {Year};Class?[] groups() default {};Class? extends Payload[] payload() default {};} 注意“ value”方法。 这暴露了注释的“值”参数我们将使用它传递注释应针对的年份。 其余代码大部分都是样板 现在约束验证器 public class YearConstraintValidator implements ConstraintValidatorYear, Date {private int annotationYear;Overridepublic void initialize(Year year) {this.annotationYear year.value();}Overridepublic boolean isValid(Date target, ConstraintValidatorContext cxt) {if(target null) {return true;}Calendar c Calendar.getInstance();c.setTime(target);int fieldYear c.get(Calendar.YEAR);return fieldYear annotationYear;}} 首先要注意的是这一次我们将传递到批注中的年份保存为约束验证器类的成员变量。 这使我们可以在“ isValid”方法中访问该值。 isValid方法是非常简单的代码可以与令人讨厌的Date / Calendar API进行搏斗以验证带注释的字段的值是否与指定的验证注释的年份匹配我可以在某个时候使用JodaTime发布示例。 现在如果我们启动我们的Web应用程序我们的两个验证就位并可以使用 就这样。 我有想念吗 有问题吗 在评论中让我知道。 全文 ZIP GitHub 要运行本教程中的代码必须已安装Gradle 。 克隆GitHub存储库或下载ZIP并解压缩。 打开命令提示符以编码位置。 运行gradle jettyRunWar。 在浏览器中导航到http// localhost8080。 参考我们的JCG合作伙伴 Steve Hanson在CodeTutr博客上提供的Spring MVC自定义验证注释 。 翻译自: https://www.javacodegeeks.com/2013/07/spring-mvc-custom-validation-annotations.html