why:

为什么要用aop实现校验?

answer:

spring mvc 默认自带的校验机制 @Valid + BindingResult, 但这种默认实现都得在Controller方法的中去接收BindingResult,从而进行校验.

eg:

if (result.hasErrors()) {

List allErrors = result.getAllErrors();

List errorlists = new ArrayList<>();

for (ObjectError objectError : allErrors) {

errorlists.add(objectError.getDefaultMessage());

}

}

获取errorlists。这样实现的话,每个需要校验的方法都得重复调用,即使封装也是。

可能上面那么说还不能表明spring 的@Valid + BindingResult实现,我先举个“栗子”。

1. 栗子(旧版本)

1.1 接口层(IDAL)

eg: 简单的POST请求,@RequestBody接收请求数据,@Valid + BindingResult进行校验

httpMethid: POST

parameters:@RequestBody接收请求数据

valid:@Valid +BindingResult

@ResponseBody

@PostMapping("body")

public ResponseVO bodyPost(@RequestBody @Valid TestVO body,BindingResult result){

//校验到错误

if (result.hasErrors()) {

List allErrors = result.getAllErrors();

List lists = new ArrayList<>();

for (ObjectError objectError : allErrors) {

lists.add(objectError.getDefaultMessage());

}

return new ResponseVO(HttpStatus.BAD_REQUEST.value(), "parameter empty", lists);

}

return new ResponseVO(HttpStatus.OK.value(), "bodyPost", null);

}

1.2 实体(vo)校验内容

@Valid + BindingResult的校验注解一大堆,网上一摸就有的!

public class TestVO {

@Getter

@Setter

@Min(value = 0,message = "请求参数isString不能小于0")

private Integer is

1.3 结果测试

2. aop校验(升级版)

可以看到若是多个像bodyPost一样都需要对body进行校验的话,那么有一坨代码就必须不断复现,即使改为父类可复用方法,也得去调用。所以左思右想还是觉得不优雅。所以有了aop进行切面校验。

2.1 接口层(IDAL)

是的!你没看错,上面那一坨代码没了,也不需要调用父类的的共用方法。就单单一个注解就完事了:@ParamValid

@ParamValid

@ResponseBody

@PostMapping("body")

public ResponseVO bodyPost(@RequestBody @Valid TestVO body,BindingResult result){

return new ResponseVO("bodyPost", null);

}

2.2 自定义注解(annotation)

这个注解也是简简单单的用于方法的注解。

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface ParamValid {}

2.3 重点!切面实现(Aspect)

切面详解:

@Before: 使用注解方式@annotation(XX),凡是使用到所需切的注解(@ParamValid),都会调用该方法

JoinPoint: 通过JoinPoint获取方法的参数,以此获取BindingResult所校验到的内容

迁移校验封装: 将原先那一坨校验迁移到Aspect中:validRequestParams

响应校验结果:

通过RequestContextHolder获取response

获取响应OutputStream

将BindingResult封装响应

@Aspect

@Component

public class ParamValidAspect {

private static final Logger log = LoggerFactory.getLogger(ParamValidAspect.class);

@Before("@annotation(paramValid)")

public void parjsON_UTF8_VALUE);

response.setStatus(HttpStatus.BAD_REQUEST.value());

OutputStream output = null;

try {

output = response.getOutputStream();

errorMap.setCode(null);

Stri编程客栈ng error = new Gson().toJson(errorMap);

log.info("aop 检测到参数不规范" + error);

output.write(error.getBytes("UTF-8"));

} catch (IOException e) {

编程客栈log.error(e.getMessage());

} finally {

try {

if (output != null) {

output.close();

}

} catch (IOException e) {

log.error(e.getMessage());

}

}

}

}

}

}

/**

* 校验

*/

private ResponseVO validRJllITzpjxequestParams(BindingResult result) {

if (result.hasErrors()) {

List allErrors = result.getAllErrors();

List lists = new ArrayList<>();

for (ObjectError objectError : allErrors) {

lists.add(objectError.getDefaultMessage());

}

return new ResponseVO(HttpStatus.BAD_REQUEST.value(), "parameter empty", lists);

}

return null;

}

}

2.4 测试结果

看了上面两种结果,就可以对比出使用Spring AOP 配合@Valid + BindingResult进行校验的优点:

去除代码冗余

AOP异步处理

优化代码实现

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: 详解Spring AOP 实现“切面式”valid校验

本文地址: http://www.cppcns.com/ruanjian/java/217997.html

java切面不需要接口了吗_详解Spring AOP 实现“切面式”valid校验相关推荐

  1. java中batch基础_详解Spring batch 入门学习教程(附源码)

    详解Spring batch 入门学习教程(附源码) 发布时间:2020-09-08 00:28:40 来源:脚本之家 阅读:99 作者:achuo Spring batch 是一个开源的批处理框架. ...

  2. java 定时任务插件_详解Spring整合Quartz实现动态定时任务

    最近项目中需要用到定时任务的功能,虽然spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 普通定时任务 首先 ...

  3. java中的静态变量的作用域_详解JAVA中static的作用

    1.深度总结 引用一位网友的话,说的非常好,如果别人问你static的作用:如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的:如果是说 可以构成 静态代码块,那别人认为你还可以: 如果你说 ...

  4. 232接口针脚定义_详解串口通信232/485/422,一文就可以搞定!

    一.RS232基础知识 计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式.由于串行通讯方式具有使用线路少.成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用 ...

  5. Java API源码在哪里找_详解查看JAVA API及JAVA源码的方法

    在java的日常学习中,我们有时候会需要看java的api说明,或者是查看java的源码,使我们更好的了解java,接下来我就来说说如何查看java的api以及java源码 对于java的api,一般 ...

  6. springboot初始化逻辑_详解Spring Boot中初始化资源的几种方式

    假设有这么一个需求,要求在项目启动过程中,完成线程池的初始化,加密证书加载等功能,你会怎么做?如果没想好答案,请接着往下看.今天介绍几种在Spring Boot中进行资源初始化的方式,帮助大家解决和回 ...

  7. java 接口访问权限_详解Java之路(五) 访问权限控制

    在Java中,所有事物都具有某种形式的访问权限控制. 访问权限的控制等级从最大到最小依次为:public,protected,包访问权限(无关键词)和private. public,protected ...

  8. java中bean的定义有哪些_详解Java的Spring框架中bean的定义以及生命周期

    bean的定义形成应用程序的骨干是由Spring IoC容器所管理的对象称为bean.bean被实例化,组装,并通过Spring IoC容器所管理的对象.这些bean由容器提供,例如,在XML的定义, ...

  9. java全局异常处理_详解Spring全局异常处理的三种方式

    在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作 ...

最新文章

  1. 人体姿态估计(Human Pose Estimation)技巧方法汇总
  2. Java中Date及Timestamp时间相关内容【转】
  3. Django-缓存、信号
  4. 理念高大上的智慧社区,要落地还得俯下身解决四个现实问题
  5. 茅台防伪溯源服务器临时维护,如何使用茅台防伪溯源系统?能辨别茅台酒真假?...
  6. html 表单优化,用CSS3优化HTML5表单的步奏
  7. 网站的服务器分哪几种,服务器有哪几种分类?_服务器可分为四种类型
  8. 微信小游戏踩坑记录(二)
  9. 【openMV】openMV之测距
  10. PM Basic Skill---project execute step
  11. oracle转mysql总结,原理+实战+视频+源码
  12. android 控件监听方法是,Android | Android中监听Button的实现
  13. yarn开启Label Scheduler
  14. 我们聊聊快排吧...
  15. linux打开文件系统调用,Linux2.4打开一个文件的系统调用
  16. 2022年上半年系统集成项目管理工程师下午真题及答案解析
  17. 分享超高清多机位现场直播间搭建方案
  18. 2017年10月份上海拍牌 最后20秒发生了什么!
  19. leach分簇功能实现matlab,LEACH分簇算法实现和能量控制算法实现
  20. ubuntu下载速度慢的解决办法--修改下载源

热门文章

  1. Mac Postman app使用方法
  2. 收拾了一下书架,感觉还是像破烂货市场一样
  3. ubuntu 设置保护色
  4. vista下推荐大家用foobar2000播放器
  5. Android-JNI开发系列《六》jni与java的交互
  6. msgget();msgsnd();msgrcv();msgctl(); 消息队列 Linux进程间的通信方式之消息队列
  7. Git(6)-- 记录每次更新到仓库图文版(git clone、status、add、diff、commit、rm、mv命令详解)
  8. 基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达
  9. Emacs之hs-minor-mode折叠代码
  10. odex vdex art区别