1. 为什么校验?

为什么需要对接口入参参数进行校验?
一个小的例子,用户注册的接口:
你需要用户输入用户名和密码,并且要求用户名长度在3-6个字符,密码6-16个字符,你需要怎么做?
下面给出一个解决方案:
@Valid + BindingResult

2. 如何校验

  1. 新建spring web项目,引入以下依赖:
<dependencies><dependency><groupId>io.swagger</groupId><artifactId>swagger-annotations</artifactId><version>1.5.21</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
  1. 新建入参实体类,在需要校验的字段上加上对应的注解
    比如你需要身高和体重不为空,加上@NotBlank注解,写入message参数信息,用户输入的身高或者体重为空时就会以此消息提示
    你想设置字段长度的参数,加上@Size注解,里面可以写min=? max=? 以及不满足要求时的提示信息message。
package com.qiyuan.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.validation.annotation.Validated;import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serializable;@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Validated
public class LimitParams implements Serializable {private static final long serialVersionUID = -7121075305092275962L;@Size(message = "姓名长度在2-16个字符",min = 2, max = 16)private String name;@Max(message = "年龄最大不超过100", value = 100)@Min(message = "年龄最小不小于18", value = 18)private int age;@NotBlank(message = "身高不能为空")private String height;@NotBlank(message = "体重不能为空")private String weight;
}

3. 新建响应数据实体

里面封装响应状态码,操作结果,业务数据以及构造函数

package com.qiyuan.bean;import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonAlias;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.apache.tomcat.util.json.JSONParser;import java.io.Serializable;@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class BaseResult<T> implements Serializable {private static final long serialVersionUID = -2723073148556358401L;/*** 状态码*/private int state;/*** 操作结果*/private String msg;/*** 业务数据*/private T data;static BaseResult success(){return new BaseResult().setMsg("操作成功").setState(200);}public BaseResult success(T data){return this.success().setData(JSONObject.toJSON(data));}static BaseResult newError(){return new BaseResult().setMsg("操作失败").setState(500);}public BaseResult newError(T data){return this.newError().setData(data);}
}

4. 新建接口controller类,开始写测试接口

在你需要对参数校验的接口上加上@Valid注解,以及BindingResult 对象
判断bingResult是否有错误信息,如果有则返回错误响应结果,同时将message返回

package com.qiyuan.controller;import com.alibaba.fastjson.JSONObject;
import com.qiyuan.bean.BaseResult;
import com.qiyuan.bean.LimitParams;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.validation.Valid;@RestController
@RequestMapping("/qiyuan/")
@Slf4j
public class InterfaceController {@GetMapping("/test")public BaseResult getParams (@RequestBody @Valid LimitParams limitParams,BindingResult bindingResult) {if(bindingResult.hasErrors()){return new BaseResult().newError(  bindingResult.getFieldError().getDefaultMessage());}log.info("start get params: params = {}", JSONObject.toJSON(limitParams));return new BaseResult().success(limitParams);}
}

5. 测试

5.1 正常成功的测试

打开接口测试工具postman,写入接口编辑入参,如下:

得到响应结果:

后台打印日志:

5.2 错误参数测试

这里我们把名字张三改成三,少于2个字,看结果:

把年龄调整为17试试,看结果,也不晓得这是啥网站,还18

Java项目如何优雅的对接口入参进行校验-看法外狂徒张三浏览18网站失败相关推荐

  1. java 调用存储过程structdescriptor,Java调用oracle存储过程,集合入参的正确姿势

    这是我工作之前遇到的一个需求,Java调用存储过程,入参是集合.踩了一些坑,决定写个干货,和大家分享下. 项目使用的oracle版本: com.oracle ojdbc6 11.2.0.1.0 sys ...

  2. java值参_Java陷阱之慎用入参做返回值详解

    正常情况下,在Java中入参是不建议用做返回值的.除了造成代码不易理解.语义不清等问题外,可能还埋下了陷阱等你入坑. 问题背景 比如有这么一段代码: @Named public class AServ ...

  3. java多线程测试框架(含入参和返回值)

    最近要对一个webservice接口做测试,需测试高并发接口是否会以异常数据返回,编写了如下demo,有类似需求的可以参考下. 注意事项: 1,线程使用了callable接口形式,call相对runa ...

  4. java @valid 密码不一致_一个成熟的Java项目如何优雅地处理异常

    (一)概述 异常处理是一个系统最重要的环节,当一个项目变得很大的时候,异常处理和日志系统能让你快速定位到问题.对于用户或者接口调用者而言,优雅的异常处理可以让调用者快速知道问题所在.本文将介绍如何优雅 ...

  5. java 实现批量注册---实现类层(含入参参数校验)

    /*** 批量注册** @param file* @return*/@Transactional@Overridepublic Result batchRegistOrganUserByTemplat ...

  6. java 自定义解码_[求助],java如何使用自定义注解对入参进行解密?

    正好之前做过自定义ArgumentResolver相关的开发. 先指出你的一个问题,ArgumentResolver是对你Controller方法上的单个参数进行解析,也就是说,你的参数是什么类型,就 ...

  7. Java项目命名规范(简洁版)——高薪必看

    作为一个优秀的项目经理或项目带头人,必须养成良好优秀的项目命名规则和习惯.接下来把查到的资料整理一下,实际上,在很多项目中,也是遵循以下的规则. 一.项目名 全部小写,比如cms.workdesk,j ...

  8. Java项目写好了,如何部署上线?看这篇文章吧

    嗨,各位小伙伴大家好,你有没有想壹哥呀?前几天有小伙伴给壹哥留言,说自己的项目写好了,想把项目部署到服务器上,这个该怎么实现呢?那么针对这个问题,今天壹哥就带大家走一遍完整的项目部署流程. 准备工作 ...

  9. spring入参为指定值,校验java入参的值为规定的值,利用Validator指定值校验注解——一看就会

    我们在使用spring项目的时候,经常使用@Valid来对入参进行校验,比如必须为空,必须不为空,长度多少,是否符合邮件格式等等,同时也可以正则. 如下图所示, @Null(message = &qu ...

最新文章

  1. K8s如何改变美团的云基础设施?
  2. CNN(Convolutional Neural Networks)没有原理只有实现
  3. 【资源总结】国内AI领域的赛事全集
  4. Android(java)学习笔记158:多线程断点下载的原理(JavaSE实现)
  5. scala集合fold实例:将两个Map合并
  6. linux 6.5 gcc包,centos6.5离线安装gcc gcc++ rpm
  7. 附近有什么?8款可以查周边的App
  8. python设计自定义栈类_Python如何自定义模块?Python基础教程,第十讲,自定义模块...
  9. hdu 4502 一维dp
  10. 疲劳驾驶监测方案_【Nano Energy】TENG用于驾驶员驾驶状态监测
  11. 数据结构上机实践第14周项目3 - 是否二叉排序树
  12. Mac小知识:只需四步,教大家如何修改苹果电脑的DNS
  13. codejock suite pro 20.2 for ActiveX
  14. png变成矢量图_ps中如何在将图转换成矢量图
  15. 机械手三维图 matlab,机械手的三维建模
  16. 360,一场阴谋的制造者
  17. 新生研讨课--无人机技术
  18. Web全栈工程师到底是个什么鬼?为什么Facebook声称:“我们只招全栈工程师!”
  19. 将数字编号翻译为英文编号(python)实现
  20. 怎样招聘出色的产品经理

热门文章

  1. 起码数学常识凸显中学数学的重大错误0
  2. MySQL字段名诸如key的报错问题
  3. 逻辑回归模型算法研究与案例分析
  4. 情商高手与小白的言辞,差别究竟在哪里?
  5. 1000行代码入门python-小白入门篇,Python到底是什么?
  6. 公寓做网络管理300多个房间,怎么做?
  7. mtk wifi display投射屏幕
  8. 算法笔记习题 2-9小节
  9. 钣金缺口lisp_方圆段钣金展开的AutoLisp编程方法
  10. stm32工程和算法分享(12)--精准闪烁灯[定时中断]