当前位置:主页 > java教程 >

JAVA中通过自定义注解进行数据验证的方法

发布:2022-09-23 09:33:26 63


本站精选了一篇JAVA相关的编程文章,网友李语诗根据主题投稿了本篇教程内容,涉及到java自定义注解、java自定义注解的使用、java验证相关内容,已被217网友关注,内容中涉及的知识点可以在下方直接下载获取。

前言

最近为了工作也为了更加深入了解掌握java注解的使用,决定自定义注解来实现数据验证。

API开发中经常会遇到一些对请求数据进行验证的情况,这时候如果使用注解就有两个好处,一是验证逻辑和业务逻辑分离,代码清晰,二是验证逻辑可以轻松复用,只需要在要验证的地方加上注解就可以。

Java提供了一些基本的验证注解,比如@NotNull、@Size,但是更多情况下需要自定义验证逻辑,这时候就可以自己实现一个验证注解,方法很简单,仅需要两个东西:

  • 一个自定义的注解,并且指定验证器
  • 一个验证器的实现

自定义验证注解

考虑有一个API,接收一个Student对象,并希望对象里的age域的值是奇数,这时候就可以创建以下注解:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = AgeValidator.class)
public @interface Odd {
String message() default "Age Must Be Odd";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

其中:

  • @Target指明这个注解要作用在什么地方,可以是对象、域、构造器等,因为要作用在age域上,因此这里选择FIELD
  • @Retention指明了注解的生命周期,可以有SOURCE(仅保存在源码中,会被编译器丢弃),CLASS(在class文件中可用,会被VM丢弃)以及RUNTIME(在运行期也被保留),这里选择了生命周期最长的RUNTIME
  • @Constraint是最关键的,它表示这个注解是一个验证注解,并且指定了一个实现验证逻辑的验证器
  • message()指明了验证失败后返回的消息,此方法为@Constraint要求
  • groups()和payload()也为@Constraint要求,可默认为空,详细用途可以查看@Constraint文档

创建验证器

有了注解之后,就需要一个验证器来实现验证逻辑:

public class AgeValidator implements ConstraintValidator<Odd,Integer> {
@Override
public void initialize(Odd constraintAnnotation) {
}

@Override
public boolean isValid(Integer age, ConstraintValidatorContext constraintValidatorContext) {
return age % 2 != 0;
}
}

其中:

  • 验证器有两个类型参数,第一个是所属的注解,第二个是注解作用地方的类型,这里因为作用在age上,因此这里用了Integer
  • initialize()可以在验证开始前调用注解里的方法,从而获取到一些注解里的参数,这里用不到
  • isValid()就是判断是否合法的地方

应用注解

注解和验证器创建好之后,就可以使用注解了:

public class Student {
@Odd
private int age;
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}
@RestController
public class StudentResource {
@PostMapping("/student")
public String addStudent(@Valid @RequestBody Student student) {
return "Student Created";
}
}

在需要启用验证的地方加上@Valid注解,这时候如果请求里的Student年龄不是奇数,就会得到一个400响应:

{
"timestamp": "2018-08-15T17:01:44.598+0000",
"status": 400,
"error": "Bad Request",
"errors": [
{
"codes": [
"Odd.student.age",
"Odd.age",
"Odd.int",
"Odd"
],
"arguments": [
{
"codes": [
"student.age",
"age"
],
"arguments": null,
"defaultMessage": "age",
"code": "age"
}
],
"defaultMessage": "Age Must Be Odd",
"objectName": "student",
"field": "age",
"rejectedValue": 12,
"bindingFailure": false,
"code": "Odd"
}
],
"message": "Validation failed for object='student'. Error count: 1",
"path": "/student"
}

也可以手动来处理错误,加上一个BindingResult来接收验证结果即可:

@RestController
public class StudentResource {
@PostMapping("/student")
public String addStudent(@Valid @RequestBody Student student, BindingResult validateResult) {
if (validateResult.hasErrors()) {
return validateResult.getAllErrors().get(0).getDefaultMessage();
}
return "Student Created";
}
}

这时候如果验证出错,便只会返回一个状态为200,内容为Age Must Be Odd的响应。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对码农之家的支持。


相关文章

  • JavaScript实现单击网页任意位置打开关闭窗口的代码

    发布:2020-06-29

    这篇文章主要介绍了JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法,涉及javascript窗口的相关操作函数与使用技巧,需要的朋友可以参考下


  • 租车系统的Java简单实现

    发布:2020-02-11

    这篇文章主要介绍了Java实现简单汽车租赁系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • 阿里巴巴Java开发规范手册

    发布:2020-02-04

    这篇文章主要介绍了JAVA开发中的一些规范讲解(阿里巴巴Java开发规范手册),需要的朋友可以参考下


  • javascript数值强制转换方法总结

    发布:2018-09-21

    本篇文章给大家带来的内容是关于javascript中的数值如何进行强制转换?(方法总结),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。


  • Java使用DateUtils对日期进行数学运算经典应用示例【附DateUtils相关包文件下载】

    发布:2022-04-13

    这篇文章主要介绍了Java使用DateUtils对日期进行数学运算的方法,可实现针对日期时间的各种常见运算功能,并附带DateUtils的相关包文件供读者下载使用,需要的朋友可以参考下


  • Java使用ffmpeg和mencoder实现视频转码

    发布:2022-08-01

    为网友们分享了关于Java的教程,这篇文章主要为大家详细介绍了Java使用ffmpeg和mencoder实现视频转码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • 实现JavaScript的组成:BOM和DOM详解

    发布:2021-05-30

    下面小编就为大家带来一篇实现JavaScript的组成----BOM和DOM详解。小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧


  • Java调用CXF WebService接口的方式实例总结

    发布:2019-06-09

    今天小编就为大家分享一篇关于Java调用CXF WebService接口的两种方式实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧


网友讨论