先配置好aop需要的配置,文:https://www.cnblogs.com/jiangxishicheng/p/10896498.html

编写校验切面类:

package com.aspect;/**
* Description:
*
* @Author: dab0
* Version: 1.0
* Create Date Time: 2019/5/20 10:29
* Update Date Time:
* @see
*/ import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.hibernate.validator.internal.engine.path.PathImpl;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.stereotype.Component;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.ObjectError; import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidatorFactory;
import javax.validation.executable.ExecutableValidator;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Set; /**
* @author: dab0
* @date:2019/5/20
* @package:com.aspect
**/
@Component
@Aspect
public class ValidAspect {
private ObjectError error; @Pointcut("execution(public * com.controller.*.*(..))")
public void valid() { } /**
* 环绕上面的valid方法切入的controller包下面的所有类方法
* 环绕通知,环绕增强,相当于MethodInterceptor
* @param pjp
* @return
*/
@Around("valid()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("方法环绕start......");
Object[] objects = pjp.getArgs();
System.out.println("------arg objects:" + objects);
if (objects.length <= 0) {
return pjp.proceed();
}
// 校验封装好的javabean
// 寻找带BindingResult参数的方法,然后判断是否有error,如果有则是校验不通过
for (Object object : objects) {
if (object instanceof BeanPropertyBindingResult) {
BeanPropertyBindingResult result = (BeanPropertyBindingResult) object;
if (result.hasErrors()) {
List<ObjectError> errorList = result.getAllErrors();
for (ObjectError objectError : errorList) {
System.out.println(objectError.getCode() + ":" + objectError.getDefaultMessage());
}
// 返回第一条
return errorList.get(0).getDefaultMessage();
}
}
} // 校验普通类型参数
// // 获得切入目标对象
Object target = pjp.getThis();
// 获得切入的方法
Method method = ((MethodSignature) pjp.getSignature()).getMethod();
// 执行校验,获得校验结果
Set<ConstraintViolation<Object>> validResult = validMethodParams(target, method, objects);
// 如果有校验不通过的
if (!validResult.isEmpty()) {
// 获得方法的参数名称
String[] parameterNames = parameterNameDiscoverer.getParameterNames(method);
for (ConstraintViolation<Object> violation : validResult) {
// 获得校验的参数路径信息
PathImpl pathImpl = (PathImpl) violation.getPropertyPath();
if (pathImpl == null) {
System.out.println("------sorry pathImpl is null.");
}
System.out.println("------pathImpl:" + pathImpl.getLeafNode());
// 获得校验的参数位置
Integer paramIndex = pathImpl.getLeafNode().getParameterIndex();
if (paramIndex == null) {
System.out.println("------sorry paramIndex is null.");
}
// 获得校验的参数名称
String paramName = parameterNames[paramIndex]; System.out.println("---------普通类型参数校验 参数名:" + paramName);
System.out.println("---------校验信息:" + violation.getMessage());
}
// 返回第一条
return validResult.iterator().next().getMessage();
}
return null;
} private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
private final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
private final ExecutableValidator validator = factory.getValidator().forExecutables(); private <T> Set<ConstraintViolation<T>> validMethodParams(T obj, Method method, Object[] params) {
return validator.validateParameters(obj, method, params);
} }

本文摘于: https://blog.csdn.net/tianyaleixiaowu/article/details/71173059

SpringMvc切面校验JavaBean及基础类型的更多相关文章

  1. SpringMVC参数校验,包括JavaBean和基本类型的校验

    该示例项目使用SpringBoot,添加web和aop依赖. SpringMVC最常用的校验是对一个javaBean的校验,默认使用hibernate-validator校验框架.而网上对校验单个参数 ...

  2. SpringMVC表单或Json中日期字符串与JavaBean的Date类型的转换

    SpringMVC表单或Json中日期字符串与JavaBean的Date类型的转换 场景一:表单中的日期字符串和JavaBean的Date类型的转换 在使用SpringMVC的时候,经常会遇到表单中的 ...

  3. SpringMVC参数校验(针对`@RequestBody`返回`400`)

    SpringMVC参数校验(针对@RequestBody返回400) 前言 习惯别人帮忙做事的结果是自己不会做事了.一直以来,spring帮我解决了程序运行中的各种问题,我只要关心我的业务逻辑,设计好 ...

  4. (四)CXF处理JavaBean以及复合类型

    前面讲的是处理简单类型,今天这里来讲下CXF处理JavaBean以及复合类型,比如集合: 这里实例是客户端传一个JavaBean,服务器端返回集合类型: 在原来的项目实例基础上,我们先创建一个实体类U ...

  5. SpringMvc数据校验@Valid等注解的使用与工具类抽取

    最近在重构老项目的代码,发现校验入参占用了很多代码,之前我对这一块的认识局限于使用StringUtils等工具来多个if块进行判断,代码是没什么问题,但是总写这些令人生烦,毕竟写代码也要讲究优雅的嘛, ...

  6. SSM框架之SpringMVC(4)返回值类型及响应数据类型

    SpringMVC(4)返回值类型及响应数据类型 1. 返回值分类 1.1. 返回字符串 Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址. @RequestM ...

  7. SpringMVC数据校验并通过国际化显示错误信息

    目录 SpringMVC数据校验并通过国际化显示错误信息 SpringMVC数据校验 在页面中显示错误信息 通过国际化显示错误信息 SpringMVC数据校验并通过国际化显示错误信息 SpringMV ...

  8. salesforce 零基础学习(五十八)通过sObject的field返回其对应的基础类型

    项目中有时候会要求通过sObject的Field的type类型返回其对应的基本类型,然后对其进行相关的处理,创建sObject的field可以选择的type类型是固定多的. 上述类型可以转换成几种基本 ...

  9. TypeScript 素描-基础类型

    博文读自 TypeScript 官方文档而来,不具有学习性,仅是本人学习时记录以供日后翻阅 ,有学习TypeScript的朋友还请去看更为详细的官方文档 TypeScript官网文档中的基础类型, T ...

随机推荐

  1. bash、dash(/bin/bash和/bin/sh)的区别

    Linux中的shell有多种类型,其中最常用的几种是Bourne   shell(sh).C   shell(csh)和Korn   shell(ksh).三种shell各有优缺点. Bourne ...

  2. SCRIPT70: 没有权限

    主要原因:iframe安全而引发的问题,浏览器中js是没有垮域访问的权限的.如果用到iframe首先确保不垮域,或者不用iframe以绕开这个问题. 另外在jquery的早期版本中如:jquery-1 ...

  3. [ CCO 2015 ] Artskjid

    \(\\\) \(Description\) \(N\)个点\(M\)条边的有向图,求从\(0\)号节点出发,\(N-1\)号节点结束,且图中每个点至多经过一次的最长路. \(N\in[2,18]\) ...

  4. "HybridDB · 性能优化 · Count Distinct的几种实现方式” 读后感

    原文地址:HybridDB · 性能优化 · Count Distinct的几种实现方式 HybridDB是阿里基于GreenPlum开发的一款MPP分析性数据库,而GreenPlum本身基于Post ...

  5. [Windows Server 2008] MySQL单数据库迁移方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:MySQL ...

  6. 【译】x86程序员手册26-7.5任务切换

    7.5 Task Switching 任务切换 The 80386 switches execution to another task in any of four cases: 80386在以下四 ...

  7. 隐藏win10任务栏输入法M图标

    在任务栏右键=>任务栏设置=>打开或关闭系统图标=>(关闭)输入指示

  8. Java多线程学习笔记(四)——Thread类中方法介绍

    currentThread():返回代码正在被哪个线程调用. public class CurrentThreadWay { public static void main(String[] args ...

  9. list.sort结果是None

    错误原因:  list.sort()功能是针对列表自己内部进行排序, 不会有返回值, 因此返回为None.  举例说明: In [19]: a=["a","c" ...

  10. pyhon模块

    模块基础 什么是模块 模块式一系列功能的集合体,而函数是某一个功能的集合体,因此模块可以看成是一堆函数的集合体.一个py文件内部可以放一堆函数,因此一个py文件就可以看成是一个模块.如果这个py文件的 ...