40. 从零开始学springboot-再谈参数合法性验证

【信息科学与工程学】【通信工程】【企业网、园区网、数据中心、广域网】各类业务网络及其网络演算算法 企业网络是一个复杂的系统,其业务、人员、流量和安全特征相互交织。下面这张表格梳理了这些核心特征及其关联的数学模型,帮你先建立整体概念。特征维度核心特征关联数学模型/方法业务特征​多样性、服务等级协议、混合云趋势图论(拓扑优化)、排队论(M/M/1)、随机过程(业务到达)、优化理论(资源调度)人员特征​角色权限差异、访问行为随机性、安全意识差异概率统计(行为建模)、随机过程(会话生成)、博弈论(安全策略)、访问控制矩阵流量特征​混合性、突发性、时空规律性、方向性(南北/东西向)泊松过程(短时突发)、重尾分布( 阅读详情

​

一、介绍

关于参数合法性验证的重要性就不多说了,即使前端对参数做了基本验证以外,后端依然还需要进行验证,以防不合规的数据直接进入后端,严重的甚至会造成系统直接崩溃!

本文结合自己在项目中的实际使用经验,主要以实用为主,对数据合法性验证做一次总结,不了解的朋友可以学习一下,同时可以立马实践到项目上去。

下面我们通过几个示例来演示如何判断参数是否合法,不多说直接开撸!

二、断言验证

对于参数的合法性验证,最初的做法比较简单,自定义一个异常类。

public class CommonException extends RuntimeException {

    /**错误码*/
    private Integer code;

    /**错误信息*/
    private String msg;

    //...set/get

    public CommonException(String msg) {
        super(msg);
        this.msg = msg;
    }

    public CommonException(String msg, Throwable cause) {
        super(msg, cause);
        this.msg = msg;
    }

}

当判断某个参数不合法的时候,直接抛异常!

@RestController
public class HelloController {

 @RequestMapping("/upload")
 public void upload(MultipartFile file) {
  if (file == null) {
   throw new CommonException("请选择上传文件!");
  }

  //.....
 }
}

然后写一个统一异常拦截器,对抛异常的程序进行处理。

这种做法比较直观,如果当前参数既要判断是否为空,又要判断长度是否超过最大长度的时候,代码就显得有点多了!

于是,程序界的大佬想到了一个更加优雅又能节省代码的方式,创建一个断言类工具类,专门用来判断参数的是否合法,如果不合法,就抛异常!

/**
 * 断言工具类
 */
public abstract class LocalAssert {

 public static void isTrue(boolean expression, String message) throws CommonException {
  if (!expression) {
   throw new CommonException(message);
  }
 }
 public static void isStringEmpty(String param, String message) throws CommonException{
  if(StringUtils.isEmpty(param)) {
   throw new CommonException(message);
  }
 }

 public static void isObjectEmpty(Object object, String message) throws CommonException {
  if (object == null) {
   throw new CommonException(message);
  }
 }

 public static void isCollectionEmpty(Collection coll, String message) throws CommonException {
  if (coll == null || (coll.size() == 0)) {
   throw new CommonException(message);
  }
 }
}

当我们需要对参数进行验证的时候,直接通过这个类就可以完成基本操作,方式如下:

@RestController
public class HelloController {

 @RequestMapping("/save")
 public void save(String name, String email) {
  LocalAssert.isStringEmpty(name, "用户名不能为空!");
  LocalAssert.isStringEmpty(email, "邮箱不能为空!");

  //.....
 }
}

相比上个步骤,当要判断的参数比较多时,代码明显简洁多了!

类似这样的工具类,spring也提供了一个名为Assert的断言工具类,在开发的时候,可以直接使用!

image

三、注解验证

使用注解对数据进行合法性验证,可以说是 java 界一项非常伟大的创新,使用这种方式不仅使的代码变得很简洁,而且阅读起来非常令人赏心悦目!

3.1、依赖包引入

下面我们一起来看看具体的实践方式,以Spring Boot工程为例,如果需要使用注解校验,直接引入spring-boot-starter-web依赖包即可,会自动将注解验证相关的依赖包打入工程!

<!-- spring boot web -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

下面在创建实体类的时候,还会用到lombok插件,因此还需要引入lombok依赖包!

<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.4</version>
    <scope>provided</scope>
</dependency>

如果是普通的Java工程,引入以下几个依赖包即可!

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.9.Final</version>
</dependency>
<dependency>
     <groupId>javax.el</groupId>
     <artifactId>javax.el-api</artifactId>
     <version>3.0.0</version>
 </dependency>
 <dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.el</artifactId>
    <version>2.2.6</version>
 </dependency>
3.2、注解校验请求对象

紧接着我们来创建一个实体User,用于模拟用户注册时的请求实体对象!

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class User {

    @NotBlank(message = "用户名不能为空!")
    private String userName;

    @Email(message = "邮箱格式不正确")
    @NotBlank(message = "邮箱不能为空!")
    private String email;

    @NotBlank(message = "密码不能为空!")
    @Size(min = 8, max = 16,message = "请输入长度在8~16位的密码")
    private String userPwd;

    @NotBlank(message = "确认密码不能为空!")
    private String confirmPwd;
}

在web层创建一个register()注册接口方法,同时在请求参数上添加@Valid,如下:

@RestController
public class UserController {

    @RequestMapping("/register")
    public boolean register(@RequestBody @Valid User user){
        if(!user.getUserPwd().equals(user.getConfirmPwd())){
            throw new CommonException("确认密码与密码不相同,请确认!");
        }
  //业务处理...
        return true;
    }
}

最后自定义一个异常全局处理器,用于处理异常消息,如下:

@Slf4j
@Configuration
public class GlobalWebMvcConfig implements WebMvcConfigurer {

    /**
     * 统一异常处理
     * @param resolvers
     */
    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        resolvers.add(new HandlerExceptionResolver() {
            @Override
            public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
                log.error("【统一异常拦截】请求出现异常,内容如下:",e);
                ModelAndView mv = new ModelAndView(new MappingJackson2JsonView());
                String uri = request.getRequestURI();
                if(e instanceof CommonException){
                    //CommonExecption为自定义异常类抛出的异常
                    printWrite(((CommonException) e).getMsg(),((CommonException) e).getData(), uri, mv);
                } else if(e instanceof MethodArgumentNotValidException){
                    //MethodArgumentNotValidException为注解校验异常类
                    //获取注解校验异常信息
                    String error = ((MethodArgumentNotValidException) e).getBindingResult().getFieldError().getDefaultMessage();
                    printWrite(error,null, uri, mv);
                } else {
                    printWrite(e.getMessage(),null, uri, mv);
                }
                return mv;
            }
        });
    }

    /**
     * 异常封装相应结果
     * @param object
     */
    private void printWrite(String msg, Object object, String uri, ModelAndView mv){
        ResResult resResult = new ResResult(uri, object);
        if(msg != null){resResult.setMsg(msg);}
        if(log.isDebugEnabled()){
            log.debug("【response】异常输出结果:" + JSONObject.toJSONString(resResult, SerializerFeature.WriteMapNullValue));
        }
        Map resultMap = BeanToMapUtil.beanToMap(resResult);
        mv.addAllObjects(resultMap);
    }
}

下面我们启动项目,使用postman来测试一把,看看效果如何?

  • 测试字段是否为空

image

  • 测试邮箱是否合法

image

  • 测试密码长度是否符合要求

image

  • 测试密码与确认密码是否相同

image

3.3、注解校验请求参数

上面我们介绍了请求对象的验证方式,那如果直接在方法上对请求参数进行验证是否同样有效呢?

为了眼见为实,下面我们就来模拟在方法上对请求参数进行验证,看看结果如何。

新建一个查询接口query,如下

@RestController
public class UserController {

    @PostMapping("/query")
    public boolean query(@RequestParam("userId") @Valid @NotBlank(message = "用户ID不能为空") String userId ){
        return true;
    }

}

使用postman请求试一试,默认给userId参数为null,结果如下:

image

很清晰的看到,query()方法中的参数注解验证无效!

当我们在UserController类上加上@Validated注解!

@RestController
@Validated
public class UserController {

    @PostMapping("/query")
    public boolean query(@RequestParam("userId") @Valid @NotBlank(message = "用户ID不能为空") String userId ){
        return true;
    }

}

使用postman请求再试一试,结果如下!

image

很清晰的看到,注解进行了验证,同时还抛出异常ConstraintViolationException!

image

@Validated参数作用于类上时,表示告诉Spring可以对方法中请求参数进行校验!

所有在实际开发的时候,我们可以使用@Validated和@Valid注解的组合来对方法中的请求参数和请求对象进行校验!

同时,@Validated和@Valid注解不仅仅只是验证控制器级别,可以验证任何Spring组件,例如Service层方法入参的验证!

@Service
@Validated
public class UserService {

    public void saveUser(@Valid User user){
        //dao插入
    }
}
3.4、自定义注解验证

默认的情况下,依赖包已经给我们提供了非常多的校验注解,如下!

  • JSR提供的校验注解!

image

  • Hibernate Validator提供的校验注解

image

但是某些情况,例如性别这个参数可能需要我们自己去验证,同时我们也可以自定义一个注解来完成参数的校验,实现方式如下!

  • 新创建一个Sex注解,其中SexValidator类指的是具体的参数验证类
@Target({FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = SexValidator.class)
@Documented
public @interface Sex {

    String message() default "性别值不在可选范围内";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
  • SexValidator类,实现自ConstraintValidator接口
public class SexValidator implements ConstraintValidator<Sex, String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        Set<String> sexSet = new HashSet<String>();
        sexSet.add("男");
        sexSet.add("女");
        return sexSet.contains(value);
    }
}

最后在User实体类上加入一个性别参数,使用自定义注解进行校验!

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class User {

    @NotBlank(message = "用户名不能为空!")
    private String userName;

    @Email(message = "邮箱格式不正确")
    @NotBlank(message = "邮箱不能为空!")
    private String email;

    @NotBlank(message = "密码不能为空!")
    @Size(min = 8, max = 16,message = "请输入长度在8~16位的密码")
    private String userPwd;

    @NotBlank(message = "确认密码不能为空!")
    private String confirmPwd;

    /**
     * 自定义注解校验
     */
    @Sex(message = "性别输入有误!")
    private String sex;
}

使用postman来请求试一试,结果如下!

  • 不传sex参数

image

很清晰的看到,已经生效!

3.5、手动进行注解校验

某些时候呢,假如有100个类需要用到校验注解,此时我们可能在每个类会加上注解@Validated或者@Valid,再增加100个这样的类,就会造成很多大量的重复工作。

而此时,我们的诉求是想对有校验注解的实体类进行全局参数验证!

解决办法就会用到Validator提供的手动注解校验证工具类,实现方法如下!

  • 新建一个注解验证工具类
/**
 * 注解校验工具类
 */
public class ValidatorUtils {

    /**
     * 获取对象中所有注解校验证异常信息
     * @param object
     * @return
     */
    public static String validated(Object object){
        List<String> errorMessageList = new ArrayList<>();
  //获取注解校验工厂
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Set<ConstraintViolation<Object>> violations = validator.validate(object);

        for (ConstraintViolation<Object> constraintViolation : violations) {
            errorMessageList.add(constraintViolation.getMessage());
        }
        return errorMessageList.toString();
    }
}
  • 使用ValidatorUtils工具类,对参数进行验证
@Test
public void testUser(){
    User user = new User();
    System.out.println(ValidatorUtils.validated(user));
}

执行之后,结果如下!

[邮箱不能为空!, 用户名不能为空!, 密码不能为空!, 确认密码不能为空!, 性别输入有误!]

当然你还可以对ValidatorUtils类进行改造,当有异常信息的时候,直接抛异常!

同时,你还可以通过@Autowired直接注入的方式来获取Validator对象!

@Autowired
Validator validator
3.6、spring 注解校验原理

如果你对springmvc的方法参数解析器(HandlerMethodArgumentResolver)了解的话,就可能会想到参数校验这块肯定是在对应的方法参数解析器里执行的。

直接定位到resolveArgument这个方法,先通过WebDataBinder进行入参属性绑定,然后再进行校验!

image

validateIfApplicable方法逻辑,会遍历当前参数methodParam所有的注解,如果注解是@Validated或者注解的名字以Valid开头,则使用WebDataBinder对象执行校验逻辑。

image

方法参数解析器只针对接口请求时入参进行验证,如果想对任何组件中方法进行注解校验,似乎还缺了点什么!

而当需要对一个类中的方法参数使用注解校验时,在类上加上@Validated就是为了告诉Spring去校验方法参数!

底层核心是通过切面代理类并配合MethodValidationPostProcessor这个后置处理器进行处理!

image

四、总结

参数验证,在开发中使用非常频繁,如何优雅的进行验证,让代码变得更加可读,是业界大佬一直在追求的目标!

本文主要是对自己在项目中的实际使用到参数验证方式加一整理,希望能帮助到各位网友!

五、参考

1、SpringMVC源码

2、JavaGuide - 如何在 Spring/Spring Boot 中做参数校验?[1]

3、胡峻峥 - SpringMvc @Validated注解执行原理[2]

参考资料

[1]

JavaGuide - 如何在 Spring/Spring Boot 中做参数校验?: https://juejin.im/post/5dc8bc745188254e7a155ba0#heading-14 [2]

胡峻峥 - SpringMvc @Validated注解执行原理: https://www.cnblogs.com/hujunzheng/p/12570921.html

本文参考公众号 “java极客技术"

请关注我的订阅号

订阅号.png

Spring Boot月度员工绩效考核管理系统设计与实现解析 在企业管理系统中,绩效考核是人力资源模块的核心环节,但它远不止增删改查,而是一套涉及状态流转、权限控制和流程审批的复杂业务。本文从Spring Boot技术栈出发,围绕月度考核系统的需求建模、实体关系与状态机设计展开,详细拆解考核计划生成、评分任务流转、权重自动汇总等核心链路,并探讨指标库配置、数据权限隔离、定时任务幂等保护以及Docker部署等工程实践要点。无论你是毕业设计还是企业内部落地,都能从中理解如何用Spring Boot构建一套可配置、可追溯、可扩展的轻量级绩效管理闭环,掌握从需求梳理到系统上线 阅读详情

相关推荐

从波士顿动力SpotMini拆解看四足机器人机械设计:关节布局与电机选型的5个关键决策点

本文深入解析波士顿动力SpotMini四足机器人的机械设计,聚焦关节布局与电机选型的5个关键决策点。通过拆解髋关节偏移距、膝关节传动链、电机热管理等核心设计,揭示商业级四足机器人的工程智慧,为工业巡检、物流机器人等应用提供实用参考。

postgres8guard的博客 892

SpringBoot 如何使用 @RequestBody 进行数据校验

RequestBody 注解用于接收前台发送的 JSON 数据,并将其转化为 Java 对象。它的作用是将 HTTP 请求正文中的 JSON 字符串绑定到相应的 Java 对象上。在 SpringBoot 中,我们通常使用 @RequestBody 注解来接收前台发送的 JSON 数据,并将其转化为 Java 对象。在 SpringBoot 中使用 @RequestBody 进行数据校验,可以有效地提高代码的健壮性和可靠性。

徐师兄的博客 3949

OnePlus线刷救砖与OTA全量包:从故障恢复到系统升级的完整指南

本文详细介绍了OnePlus手机线刷救砖与OTA全量包的完整操作指南,包括故障诊断、线刷救砖实战教程、OTA全量包升级优势及进阶玩法。通过具体案例和实用技巧,帮助用户从系统故障恢复到安全升级,特别适合Android系统爱好者和OnePlus用户。

weixin_30338481的博客 616

Springboot教程一使用合理的参数校验拦截判断请求参数是否规范化合理化参数校验

SpringBoot自带的参数检验,怎么使用

道阻且长,行则将至 行而不辍,未来可期 1552

fsQCA实战:从数据校准到结果解读的完整流程(附R代码示例)

本文提供了一份完整的模糊集定性比较分析(fsQCA)实战指南,详细阐述了从数据校准、必要条件分析、真值表构建到布尔最小化与结果解读的全流程。通过R语言代码示例,帮助研究者掌握如何将理论转化为可操作的分析步骤,并产出稳健的中间解,以揭示导致结果的复杂条件组合。

d6e7f8g9h的博客 1168

Xilinx Blockset Counter计数器模块使用及参数配置

本文详细介绍了Simulink中Xilinx Blockset库Counter模块的使用以及参数说明。

白码王子小张的博客 1093

Spring Boot直接执行传入的sql语句,同时校验sql,执行成功之后设置手动回滚

在执行Sql语句时,将整条Sql语句作为参数来执行,使用注解的方式在dao层使用如下: @Select("${sql}") List<LinkedHashMap<String,Object>> checkSql(@Param("sql") String sql); 在验证sql是否正确时,想通过执行sql来验证,当执行成功时,则sql正确,当执行sql失败时,则结果异...

qq_27182767的博客 3223

新手必看!Cisco Packet Tracer 8.2从安装到完成第一个局域网实验(附常见问题解决)

本文为网络新手提供了Cisco Packet Tracer 8.2的完整入门指南。从官方下载安装、界面熟悉,到核心的拖拽设备、连线、配置IP地址三步操作,手把手教你完成第一个局域网组网实验。文章重点讲解了如何通过Ping命令验证连通性,并附带了连线错误、IP配置不当等常见问题的解决思路,帮助初学者快速上手这款强大的思科模拟器。

android的专栏 866

如何在 SpringBoot 中优雅的做参数校验?

关于参数合法性验证的重要性就不多说了,即使前端对参数做了基本验证,后端依然也需要进行验证,以防不合规的数据直接进入服务器,如果不对其进行拦截,严重的甚至会造成系统直接崩溃!

程序员志哥的博客 1483

Hyper-V创建Ubuntu虚拟机设置固定IP

本文记录使用hyper-v创建ubuntu虚拟机,为虚拟设置固定IP且通过物理机可访问。

2622

蓝牙功耗优化实战:连接蓝牙耳机时高耗电问题的深度排查与解决

连接任意一款蓝牙耳机, 进行插入实网SIM卡, 同时连接蓝牙耳机后, 进入IDLE模式, 测试时间为10分钟的测试结果, 平均电流毫安在8左右. 测试结果1: 平均电流 8.84mA 测试结果2: 平均电流 7.39mA 厘清问题: 由于出现上两幅图中 绿色线圈中的 20mA 左右高耗电时段, 从而将整体的平均电流抬高. 于是在记录IDLE下电流出现绿色线圈中的 20mA 左右高耗电时段, 同时录制UART1 Catcher log. Filter: MOD_BT/MOD_ATC.

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 1001

程序员你如何检查参数的合法性?

作为程序员的你,代码中最多的就是各种方法了,你是如何对参数进行校验的呢? 背景 大部分的方法和构造函数对传入的参数值有一些限制,比如:常见的索引值必须是非负数,对象引用不能为空。 你应该使用清晰的文档来标注所有的这些限制,然后在方法体开始的地方强制他们检查。 应该在错误发生的时候尽快的检查出来,这是基本原则。 如果你不这么做,当错误发生的时候,错误将不会被检测出来,这让定位错误的源头变得更困难。 如果一个非法参数传递到一个方法中,在方法执行前进行了参数检查。它将会快速失败,并给出清晰的异常信息。 如果方法.

游戏发行平台,跨境电商,低代码,物联网,数字人商业项目架构师 1720

图神经网络实战——利用节点回归预测网络流量

在机器学习中,回归指的是对连续值的预测。通常与分类形成鲜明对比,分类的目标是找到正确的类别(即离散值,而非连续值)。在图数据中,分类和回归分别对应于节点分类和节点回归。在本节中,我们将尝试预测每个节点的连续值,而非分类变量。

盼小辉丶的博客 1万+

SpringBoot+Vue构建高效约稿平台架构实践

前后端分离架构已成为现代Web开发的主流范式,其核心原理是通过RESTful API实现前后端解耦。SpringBoot作为Java生态的微服务框架,结合Vue的响应式前端,能显著提升开发效率和系统可维护性。在数字创意经济领域,这种技术组合特别适合约稿平台等需要频繁迭代的业务场景。通过MyBatis-Plus简化数据访问层开发,配合Element Plus组件库快速构建专业UI,开发者可以专注于核心业务逻辑实现。本文以线上约稿平台为例,详解如何利用SpringBoot状态机管理订单生命周期,以及使用Redi

weixin_30908103的博客 368

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C# MVC 判断控制器方法是否是ajax请求,全局文件Global.asax判断和过滤类里判断

C# MVC 判断控制器方法是否是ajax请求,全局文件Global.asax判断和过滤类里判断

小5聊的博客 1412

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

通过Spring注解校验枚举参数的合法性

首先定义一个枚举校验器,题主这边的枚举校验器只能校验,String类型和Integer类型。如果需要支持其他的类型,请各位coder自行实现。/*** 枚举校验注解处理类*/@Override@Overrideif (!try {List

m0_37903574的博客 896

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

判断一个字符串是否是合法的JSON字符串

判断一个字符串是否是合法的JSON字符串pom.xml &lt;dependency&gt; &lt;groupId&gt;com.alibaba&lt;/groupId&gt; &lt;artifactId&gt;fastjson&lt;/artifactId&gt; &lt;version&gt;1.2.31...

天天的专栏 1万+

Spring Boot 参数校验

spring boot 实现参数校验,包括自定义规则校验,分组校验,全局异常处理等

AaronSimon的博客 1667

Spring Boot 从入门到精通(二)数据校验

在很多时候,当我们要处理⼀个应⽤程序的业务逻辑时,数据校验是必须要考虑和⾯对的事情。应⽤程序必须通过某种⼿段来确保输⼊进来的数据从语义上来讲是正确的。在 Java 应⽤程序中,必须要对输⼊进来的数据从语义上分析是有效的,也就是数据校验。 输⼊验证是最重要的 Web 开发任务之⼀,在 Spring MVC 中有两种⽅式可以验证输⼊: ⼀种是 Spring ⾃带的验证框架,另外⼀种是利⽤ JSR ...

程序员世杰 427

3 判断是否为合法的URL

请补全JavaScript代码,要求以Boolean的形式返回字符串参数是否为合法的URL格式。中等 通过率:42.50% 时间限制:3秒 空间限制:256M。注意:1. 协议仅为HTTP(S)3 判断是否为合法的URL。

cjhxydream的博客 693

泛型:断言

泛型编程>:断言 Andrei Alexandrescu        本部分“泛型编程>”讨论断言(assertions),一个你兵器库内非常强大的工具。以assert为基础,我们建立一个更强大的工具,帮助你建立更好的程序。我们很快就能看到,断言不仅是简单的工具/宏/函数。这是一种生活方式,一道深深的鸿沟把程序员们分成两类:了解,和不了解断言的力量。   Assert(cool);      

merced1976的专栏 2191

Springboot集成validation校验API参数的合法性

前言:validation主要用于校验用户提交的数据的合法性,比如字符长度,是否为空,密码是否符合规则,邮箱格式是否正确等等,市场上校验框架比较多,用的比较广泛的是hibernate-validator, 既支持国际化,也支持自定义校验类型的注解,这里简单的演示校验框架在Springboot中如何集成。第一步:添加pom依赖<dependency> &l...

开发者导航 1969

从 Java 编码看接口参数合法性校验的重要性

以下来源于本人在 GitChat 平台上撰写的博文。互联网行业高速发展,Java语言在企业级开发中扮演着重要角色,其中以微服务架构生产实践较多,前后端分离模式开发贯穿整个软件开发生命周期...

码上修行 1047

SpringBoot自动校验请求参数合法性

一 简介 介绍一种可以快速进行请求参数校验的注解,前几天前端大佬说,校验不能写代码,不能写逻辑,作为小白,我以前接触过@vaild这个注解,但是hibermate框架用这个比较多。SPringBoot—MyBatis多半都是前端校验非必要和必要两种参数,后端校验必要参数,会集中切面去校验,@vaild就是运用的AOP切面抽离,统一校验的方式,实现方法很简单,很快捷。 二 实现过程-三个部分 运用主体技术:SpringBoot,MyBatis,Swagger2。。。 第一部分 引入依赖 &lt

TomPig_1024 754

谁来检查方法参数合法性

&#13; &#13; &#13; &#13; &#13; &#13; &#13; 我们在编程中的函数或者是方法,大多数都是有参数的。参数对于方法来说是很重要的输入数据,传入的参数值的...

技术小黑屋 2204

检查函数传入参数的合法性

python是一门动态语言,因此在调用函数的时候,可以传入任何类型的数据,而他又是一门强类型语言,当传入的参数不合法时,便会在内部报错。 为了减少这一错误的发生,python从3.5开始引入了函数注解,如下所示: def fn(x:int, y:int): pass 配合inspect模块,可以有效的检查传入函数是否合法 ...

qq_41956880的博客 2412
上一篇: 02. 就该这么学并发 - 线程的就绪与执行
下一篇: 03. 就该这么学并发 - 线程的阻塞
码哥说
博客等级 码龄8年 5645粉丝 172原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值