返回顶部
首页 > 资讯 > 精选 >Spring boot怎么实现超灵活的注解式数据校验
  • 872
分享到

Spring boot怎么实现超灵活的注解式数据校验

2023-06-21 22:06:57 872人浏览 泡泡鱼
摘要

本篇内容主要讲解“spring boot怎么实现超灵活的注解式数据校验”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring boot怎么实现超灵活的注解式数据校验”吧!

本篇内容主要讲解“spring boot怎么实现超灵活的注解式数据校验”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring boot怎么实现超灵活的注解式数据校验”吧!

通过切面,实现超灵活的注解式数据校验

在企业系统的开发中,用户表单输入的场景是会经常遇见的,如何让数据校验脱离于业务代码逻辑,谁也不想在逻辑代码里对字段逐一判断。。。。

Spring mvc的校验方式

在使用Spring MVC时的时候,直接使用hibernate-validator的注解,如下:

public class User {    private Long id;    @NotBlank(message = "name不能为空")    @Size(min = 5, max = 10, message = "字符在5到10个")    private String name;    private String des;    @NotNull    @Max(value = 3, message = "type 参数错误")    @Min(value = 0, message = "type 参数错误")    private Integer type;    @Min(value = 0, message = "参数错误, limit必须大于或等于0")      private int limit;    @Pattern(regexp = "^(true|false)$", message = "参数错误, 参数isActive只能是true或者false")    private String flag;    // setters and getters

然后将User对象作为Controller的参数,交给Spring MVC去帮你校验。

通过切面实现自己的注解式数据校验

这是一个SOA的微服务应用,没有controller和Spring MVC,当然也没有所谓的容器(Tomcat、Jetty),对于来自于client的调用,也要进行参数校验。继续基于hibernate-validator,

参看validator的官方文档

引入依赖:

<dependency>   <groupId>org.hibernate</groupId>   <artifactId>hibernate-validator-cdi</artifactId>   <version>5.4.1.Final</version></dependency><dependency>   <groupId>org.glassfish</groupId>   <artifactId>javax.el</artifactId>   <version>3.0.1-b08</version></dependency>

这里需要引入Spring Bootaop的一些知识点,自行去网上Google吧。我直接上代码了,谁叫我是代码的搬运工。

定义一个切面:

@Aspect  //一个切面@Configuration  // spring boot 配置类public class RequestParamValidAspect {    private final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();    private final ExecutableValidator methodValidator = factory.getValidator().forExecutables();    private final Validator beanValidator = factory.getValidator();    private <T> Set<ConstraintViolation<T>> validMethodParams(T obj, Method method, Object [] params){        return methodValidator.validateParameters(obj, method, params);    }    private <T> Set<ConstraintViolation<T>> validBeanParams(T bean) {        return beanValidator.validate(bean);    }    @Pointcut("execution(* com.jiaobuchong.commodity.service.*.*(..))")    public void soaServiceBefore(){}        @Before("soaServiceBefore()")    public void twiceAsOld1(JoinPoint point) {        //  获得切入目标对象        Object target = point.getThis();        // 获得切入方法参数        Object [] args = point.getArgs();        // 获得切入的方法        Method method = ((MethodSignature)point.getSignature()).getMethod();        // 校验以基本数据类型 为方法参数的        Set<ConstraintViolation<Object>> validResult = validMethodParams(target, method, args);        Iterator<ConstraintViolation<Object>> violationIterator = validResult.iterator();        while (violationIterator.hasNext()) {            // 此处可以抛个异常提示用户参数输入格式不正确            System.out.println("method check---------" + violationIterator.next().getMessage());        }        // 校验以java bean对象 为方法参数的         for (Object bean : args) {            if (null != bean) {                validResult = validBeanParams(bean);                violationIterator = validResult.iterator();                while (violationIterator.hasNext()) {            // 此处可以抛个异常提示用户参数输入格式不正确                    System.out.println("bean check-------" + violationIterator.next().getMessage());                }            }        }    }}

具体的Service

// DemoService.javapublic interface DemoService {    void one(@NotNull(message = "不能为null") Integer a, @NotBlank String b);    void two(@NotNull(message = "paramsVo不能为null") ParamsVo paramsVo,             @NotNull(message = "go不能为null") String go);}// ParamsVo.javapublic class ParamsVo {    @NotBlank(message = "不能为空")    private String name;    @NotBlank    @Length(min = 2, max = 20, message = "不可以为空,最多20个字")    private String desc;    @NotNull    @Valid  // 需要加上@Valid注解,不然不会校验到Img对象    private List<Img> imgList;    @NotNull(message = "length不能为null")    @Range(min = 3, max = 100, message = "长度范围3-100")    private Integer length;    // omitted other code}public class Img {    @NotNull(message = "img id 不能为null")    private Long id;    @NotBlank(message = "img name 不能为空")    private String name;    // omitted other code}

运行DemoService:

@Autowired     private DemoService demoService;    @Test    public void testGo() {        demoService.one(null, "");        ParamsVo paramsVo = new ParamsVo();        List<Img> list = new ArrayList<>();        Img img = new Img();        list.add(img);        paramsVo.setImgList(list);        paramsVo.setDesc("你");        paramsVo.setLength(1);        demoService.two(paramsVo, null);    }

运行结果:

method check———不能为空
method check———不能为null
method check———go不能为null
bean check——-img name 不能为空
bean check——-不能为空
bean check——-深度范围3-100
bean check——-img id 不能为null
bean check——-不可以为空,最多20个字

这样比Spring MVC的校验功能还强大了,

// Spring MVC中对下面这样的校验是没有作用的void one(@NotNull(message = "不能为null") Integer a, @NotBlank String b);

经过一番改造后,啥都支持了。而且独立于业务逻辑,维护和新增校验都很方便,代码量也变少了!

Spring boot aop注解数据权限校验

注解类

@Retention(RetentionPolicy.RUNTIME)public @interface DataAuthValid{        //位置    public int index() default 0;        //字段   id    //public String id() default "id";        //字段   id    public String orgId() default "org_id";        //mapper    @SuppressWarnings("rawtypes")    public Class<? extends Mapper> mapper();}

AOP切面

@Aspect@Component@Order(1)public class DataAuthAop {     private static String types = "java.lang.String,java.lang.Long,long";        @Before("@annotation(dataAuth)")    public void beforeMethod(JoinPoint point,DataAuthValid dataAuth) throws Exception {                httpservletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();        Map<String, Object> payloadMap = (Map<String, Object>) request.getAttribute("payloadMap");        Long companyid = Long.parseLong(payloadMap.get("companyid")+"");        if(companyid != 1) {            Object[] args = point.getArgs();            Object obj = args[dataAuth.index()];            String ids = null;            String typeName = obj.getClass().getTypeName();            if(types.contains(typeName)) {                ids = obj + "";            }else {                Field[] fields = obj.getClass().getDeclaredFields();                for (Field f : fields) {                    f.setAccessible(true);                    if("id".equals(f.getName())) {                        Long id = (Long) f.get(obj);                        ids = id + "";                    }                }            }            String[] idArr = ids.split(",");            for (String id : idArr) {                Class cla = dataAuth.mapper();                Mapper mapper = (Mapper) SpringBeanFactoryUtils.getApplicationContext().getBean(cla);                Object object = mapper.selectByPrimaryKey(Long.valueOf(id));                Field field = obj.getClass().getDeclaredField(dataAuth.orgId());                field.setAccessible(true);                Long orgId = (Long)field.get(obj);                if(!companyid.equals(orgId)) {                    throw new RuntimeException();                }            }        }    }}

使用

Spring boot怎么实现超灵活的注解式数据校验

到此,相信大家对“Spring boot怎么实现超灵活的注解式数据校验”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Spring boot怎么实现超灵活的注解式数据校验

本文链接: https://lsjlt.com/news/301080.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring boot怎么实现超灵活的注解式数据校验
    本篇内容主要讲解“Spring boot怎么实现超灵活的注解式数据校验”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring boot怎么实现超灵活的注解式数据校验”吧!...
    99+
    2023-06-21
  • Springboot通过切面,实现超灵活的注解式数据校验过程
    目录通过切面,实现超灵活的注解式数据校验Spring MVC的校验方式通过切面实现自己的注解式数据校验Spring boot aop注解数据权限校验注解类AOP切面使用通过切面,实现...
    99+
    2024-04-02
  • Spring Boot怎么实现请求参数校验
    这篇文章主要介绍了Spring Boot怎么实现请求参数校验的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring Boot怎么实现请求参数校验文章都会有所收获,下面我们一...
    99+
    2024-04-02
  • spring-boot-starter-validation 校验参数的实现
    目录一、前言二、常用注解三、定义分组四、定义需要校验的对象五、在handler 即 Controller中 校验六、定义全局异常处理类七、测试效果八、嵌套对象的校验九、自定义注解(自...
    99+
    2024-04-02
  • spring boot输入数据校验(validation)的实现过程
    项目内容 实现一个简单的用户注册接口,演示怎样进行数据校验。 要求 JDK1.8或更新版本 Eclipse开发环境 如没有开发环境,可参考 [spring boo...
    99+
    2024-04-02
  • Spring Validation怎么实现数据校验
    这篇文章主要讲解了“Spring Validation怎么实现数据校验”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Validation怎么实现数据校验”吧...
    99+
    2023-07-05
  • Spring Validation实现数据校验的示例
    目录一、什么是 Spring Validation二、实现数据校验准备相关jar包⚪Validator接口方式⚪基于注解方式(Bean Validation)⚪基于方法的方式⚪自定义...
    99+
    2023-03-06
    Spring Validation 数据校验 Spring  数据校验
  • 参数校验Spring的@Valid注解有什么用
    小编给大家分享一下参数校验Spring的@Valid注解有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!参数校验Spring的@Valid注解@Valid ...
    99+
    2023-06-20
  • validate 注册页的表单数据校验实现详解
    目录1.注册页是什么2.为什么需要注册页3.注册页如何实现3.1分析业务需求3.2获取数据 v-model双向绑定3.3校验数据3.4method中的发送数据3.5处理数据4总结1....
    99+
    2024-04-02
  • 怎么通过自定义spring invalidator注解校验数据合法性
    今天小编给大家分享一下怎么通过自定义spring invalidator注解校验数据合法性的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面...
    99+
    2023-07-02
  • Java利用自定义注解实现数据校验
    目录JSR303介绍引入依赖常用注解开启校验数据校验测试自定义的封装错误信息统一异常处理分组校验创建分组校验接口添加校验注解开启分组校验自定义校验编写自定义的校验注解编写自定义的校验...
    99+
    2024-04-02
  • Spring Boot 中怎么利用JSR303 实现参数验证
    今天就跟大家聊聊有关Spring Boot 中怎么利用JSR303 实现参数验证,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Bean Validation 规范内嵌的约束注解实例基...
    99+
    2023-06-05
  • Java中怎么实现接口数据校验
    今天就跟大家聊聊有关Java中怎么实现接口数据校验,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Controller接口层数据绑定校验实际上在Java开发中目前普通使用的Bean数据...
    99+
    2023-06-15
  • 使用自定义注解+springAop实现参数非空校验方式
    目录自定义注解+springAop参数非空校验新建注解类@interface ParamsVerify利用springAop来实现切面新建一个切面类使用注解统一校验参数非空1. 待校...
    99+
    2024-04-02
  • javascript怎么实现进行客户端数据的校验
    这篇文章主要讲解了“javascript怎么实现进行客户端数据的校验”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript怎么实现进行客户端数据的校验”吧!脚本代码:<scrip...
    99+
    2023-06-03
  • 使用SpringMVC怎么实现对数据进行校验
    使用SpringMVC怎么实现对数据进行校验?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、导入jar包若要实现数据校验功能,需要导入必要的jar包,主要包括以下几个:c...
    99+
    2023-05-31
    springmvc
  • 怎么实现 Spring Boot 接口参数加密解密
    本篇内容主要讲解“怎么实现 Spring Boot 接口参数加密解密”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么实现 Spring Boot 接口参数加密解密”吧!加密解密本身并不是难事,...
    99+
    2023-06-17
  • js前端表单数据处理和校验怎么实现
    这篇文章主要介绍了js前端表单数据处理和校验怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇js前端表单数据处理和校验怎么实现文章都会有所收获,下面我们一起来看看吧。1.数据处理当表单在视图所展示的数据并...
    99+
    2023-07-02
  • Spring Boot中单例类实现对象的注入方式是什么
    本篇内容介绍了“Spring Boot中单例类实现对象的注入方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Spring Boot ...
    99+
    2023-06-20
  • 怎么在SpringBoot中通过自定义注解实现一个Token校验功能
    本篇文章为大家展示了怎么在SpringBoot中通过自定义注解实现一个Token校验功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。定义Token的注解,需要Token校验的接口,方法上加上此注解...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作