Java项目如何优雅的对接口入参进行校验-看法外狂徒张三浏览18网站失败
1. 为什么校验?
为什么需要对接口入参参数进行校验?
一个小的例子,用户注册的接口:
你需要用户输入用户名和密码,并且要求用户名长度在3-6个字符,密码6-16个字符,你需要怎么做?
下面给出一个解决方案:
@Valid + BindingResult
2. 如何校验
- 新建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>
- 新建入参实体类,在需要校验的字段上加上对应的注解
比如你需要身高和体重不为空,加上@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网站失败相关推荐
- java 调用存储过程structdescriptor,Java调用oracle存储过程,集合入参的正确姿势
这是我工作之前遇到的一个需求,Java调用存储过程,入参是集合.踩了一些坑,决定写个干货,和大家分享下. 项目使用的oracle版本: com.oracle ojdbc6 11.2.0.1.0 sys ...
- java值参_Java陷阱之慎用入参做返回值详解
正常情况下,在Java中入参是不建议用做返回值的.除了造成代码不易理解.语义不清等问题外,可能还埋下了陷阱等你入坑. 问题背景 比如有这么一段代码: @Named public class AServ ...
- java多线程测试框架(含入参和返回值)
最近要对一个webservice接口做测试,需测试高并发接口是否会以异常数据返回,编写了如下demo,有类似需求的可以参考下. 注意事项: 1,线程使用了callable接口形式,call相对runa ...
- java @valid 密码不一致_一个成熟的Java项目如何优雅地处理异常
(一)概述 异常处理是一个系统最重要的环节,当一个项目变得很大的时候,异常处理和日志系统能让你快速定位到问题.对于用户或者接口调用者而言,优雅的异常处理可以让调用者快速知道问题所在.本文将介绍如何优雅 ...
- java 实现批量注册---实现类层(含入参参数校验)
/*** 批量注册** @param file* @return*/@Transactional@Overridepublic Result batchRegistOrganUserByTemplat ...
- java 自定义解码_[求助],java如何使用自定义注解对入参进行解密?
正好之前做过自定义ArgumentResolver相关的开发. 先指出你的一个问题,ArgumentResolver是对你Controller方法上的单个参数进行解析,也就是说,你的参数是什么类型,就 ...
- Java项目命名规范(简洁版)——高薪必看
作为一个优秀的项目经理或项目带头人,必须养成良好优秀的项目命名规则和习惯.接下来把查到的资料整理一下,实际上,在很多项目中,也是遵循以下的规则. 一.项目名 全部小写,比如cms.workdesk,j ...
- Java项目写好了,如何部署上线?看这篇文章吧
嗨,各位小伙伴大家好,你有没有想壹哥呀?前几天有小伙伴给壹哥留言,说自己的项目写好了,想把项目部署到服务器上,这个该怎么实现呢?那么针对这个问题,今天壹哥就带大家走一遍完整的项目部署流程. 准备工作 ...
- spring入参为指定值,校验java入参的值为规定的值,利用Validator指定值校验注解——一看就会
我们在使用spring项目的时候,经常使用@Valid来对入参进行校验,比如必须为空,必须不为空,长度多少,是否符合邮件格式等等,同时也可以正则. 如下图所示, @Null(message = &qu ...
最新文章
- K8s如何改变美团的云基础设施?
- CNN(Convolutional Neural Networks)没有原理只有实现
- 【资源总结】国内AI领域的赛事全集
- Android(java)学习笔记158:多线程断点下载的原理(JavaSE实现)
- scala集合fold实例:将两个Map合并
- linux 6.5 gcc包,centos6.5离线安装gcc gcc++ rpm
- 附近有什么?8款可以查周边的App
- python设计自定义栈类_Python如何自定义模块?Python基础教程,第十讲,自定义模块...
- hdu 4502 一维dp
- 疲劳驾驶监测方案_【Nano Energy】TENG用于驾驶员驾驶状态监测
- 数据结构上机实践第14周项目3 - 是否二叉排序树
- Mac小知识:只需四步,教大家如何修改苹果电脑的DNS
- codejock suite pro 20.2 for ActiveX
- png变成矢量图_ps中如何在将图转换成矢量图
- 机械手三维图 matlab,机械手的三维建模
- 360,一场阴谋的制造者
- 新生研讨课--无人机技术
- Web全栈工程师到底是个什么鬼?为什么Facebook声称:“我们只招全栈工程师!”
- 将数字编号翻译为英文编号(python)实现
- 怎样招聘出色的产品经理