SpringBoot接⼝接收json参数解析
⽬录
SpringBoot接⼝接收json参数
前⾔
前提
⼀、GET
⼆、DELETE
三、POST/PUT/PATCH
Springboot restFul 参数检验
概述
常⽤注解
简单应⽤举例
⾃定义校验
抛出BindException⽽⾮MethodArgumentNotValidException
SpringBoot接⼝接收json参数
前⾔
通常来讲,HTTP ⽅法会映射为 CRUD 动作,但这并不是严格的限制,有时候 PUT 也可以⽤来创建新的资源,POST 也可以⽤来更新资源。所以在平时的 Web 开发中,你可能常看到method 的值是 GET 和 POST,但是我们需要养成⼀个好的编码习惯。
CRUD 动作HTTP ⽅法
Create POST
Read GET
Update PUT(全部资源)或 PATCH(部分资源)
Delete DELETE
前提
⾸先在controller上加上注解:@RestController
@RestController
@RequestMapping("/user")
@Api(tags = "user", description = "⽤户控制器")
public class UserController {
// ...
}
详细介绍
⼀、GET
1)@PathVariable 获取路径参数。即 url/{id} 这种形式。
@GetMapping("/getDetail/{id}")
@ApiOperation(value = "根据id获取⽤户")
public RbacUser getDetail(@PathVariable Long id) {
ById(id);
}
2)@RequestParam 获取查询参数。即 url?name=xx 这种形式
主要有参数:
value:参数名字,即⼊参的请求参数名字,如username表⽰请求的参数区中的名字为username的参数的值将传⼊;
required:是否必须,默认是true,表⽰请求中⼀定要有相应的参数,否则会报错;
@GetMapping("/getByAccount")
@ApiOperation(value = "根据账号获取⽤户")
public RbacUser getByAccount(@RequestParam(required = false) String account) {
ByAccount(account);
}
3) 直接封装DTO参数形式
@GetMapping("/find")
@ApiOperation(value = "根据条件获取⽤户")
public List<RbacUser> find(RbacUserDTO rbacUserDTO) {
return userService.find(rbacUserDTO);
}
⼆、DELETE
@PathVariable 获取路径参数。即 url/{id} 这种形式。
@DeleteMapping("/delete/{id}")
@ApiOperation(value = "删除⽤户")
public void delete(@PathVariable Long id) {
userService.delete(id);
}
三、POST/PUT/PATCH
@RequestBody 将HTTP请求正⽂插⼊⽅法中,使⽤适合的 HttpMessageConverter 将请求体写⼊某个对象。
@PostMapping("/create")
@ApiOperation(value = "创建⽤户")
public RbacUser getByAccount(@RequestBody @Validated RbacUserDTO rbacUserDTO) {
return userService.save(rbacUserDTO);
}
@Validated:对数据进⾏校验,以下注解报错会直接返回,如果校验类中包含⼀个对象引⽤属性,需要在属性上加上@Valid注解
具体参数检验请参看下⾯
Springboot restFul 参数检验
概述
对请求参数进⾏检验,这在web中开始经常能碰到,如果⽤⼀个个if/else去做判断,相信这样的代码可读性会⽐较差
JSR-303 是java为bean数据合法性校验提供的标准框架,是Java EE6中的⼀项⼦规范,叫做BeanValidation。JSR303通过
在Bean属性上标注@NotNull、@Max等标准的注解指定校验规则,并通过这些标准的验证接⼝对Bean进⾏验证。
规定⼀些检验规范即校验注解,如@Null, @NotNull, @Pattern,位于straints包下,只提供规范不提供实现。
在Spring中,有两种⽅式可以验证输⼊,⼀是利⽤Spring⾃带的验证框架,⼆是利⽤JSR-303的实现,⼀般建议使⽤JSR-303的实现,⽐如Hibernate-Validator。
Hibernate-Validator 是JSR-303的实现。Hibernate Validator提供了JSR-303规范中所有内置constraint的实现,除此之外还有⼀些附加的constraint,如@Email, @Length, @Range等,位于org.straints包下。
spring-boot-starter-web包⾥⾯已经有了hibernate-vlidator包,不需要额外引⽤hibernate validator依赖。
同时Spring为了给开发者提供便捷,对Hibernate-Validator进⾏了⼆次封装,封装了LocalValidatorFactorBean作为validator 的实现,这个类兼容了Spring的Validation体系和Hibernate的Validation体系,LocalValidatorFactorBean已经成为了Validator 的默认实现。
说明:JSR-349是JSR-303的升级版,添加了⼀些新特性
如下图,是spring boot 2.1.1中hibernate依赖情况:
常⽤注解
属性描述举例
@AssertTrue应⽤于boolean属性,该属性值必须为true @AssertTrue boolean isOkay;
@AssertFalse应⽤于boolean属性,该属性值必须为false @AssertFalse boolean isOkay;
@DecimalMax只能⼩于或等于指定值@DecimalMax("1.1") BigDecimal price;
@DecimalMin只能⼤于或等于指定值@DecimalMin("1.1") BigDecimal price;
@Digits该属性值必须在指定范围内,interger属性定义该数值的最⼤整数部分,fraction属性定义该数值的最⼤⼩数部分@Digits(integer=5, fraction=2) BigDecimal price;
@Future检查该字段是否是属于未来的⽇期@Future
Date shippingDate;
@Max该字段的值只能⼩于或等于该值@Max(20) int age;
@Min该字段的值只能⼤于或等于该值@Min(20) int age;
@NotNull该字段不能为Null @NotNull String name;
@Null该字段必须是Null @Null String dest;
@Past该字段必须是过去的⼀个⽇期@Past
Date birthDate;
@Size检查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等@Size(min=2, max=10) String description;
@Pattern该属性值必须与指定的常规表达式相匹配@Pattern(regexp="\\d{3}") String areaCode;
@NotBlank只⽤于String, 不能为Null且trim()之后size>0@NotBlank String src;
@NotEmpty不能为Null,且size>0@NotEmpty String src;
@Email被注释的元素必须是电⼦邮箱地址
@Length被注释的字符串String ⼤⼩必须在指定范围内@Length(min=6, max=12, message="密码长度必须在6~12") String src;
@Range BigDecimal,BigInteger,CharSequence, byte, short, int, long等原⼦类型和包装类型,验证注解的元素值在最⼩值和最⼤值之间
@Valid 指定递归验证(下篇讲)关联的对象;
如⽤户对象中有个地址对象属性,如果想在验证⽤户对象时⼀起验证地址对象的话,在地址对象上加@Valid注解即可级联验证
简单应⽤举例
需要检验的Bean定义:
public class StudentBean implements Serializable{
@NotBlank(message = "⽤户名不能为空")
private String name;
@Min(value = 18, message = "年龄不能⼩于18岁")
private Integer age;
@Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "⼿机号格式错误")    private String phoneNum;
@Email(message = "邮箱格式错误")
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
validation框架}
public String getEmail() {
return email;
}
public void setEmail(String email) {
}
}
返回错误字段定义:
public class ArgumentsInvalidResponseBean {
private String argumentName;
private String exceptionMsg;
public ArgumentsInvalidResponseBean() {
}
public ArgumentsInvalidResponseBean(String argumentName, String exceptionMsg) {
this.argumentName = argumentName;
}
public String getArgumentName() {
return argumentName;
}
public void setArgumentName(String argumentName) {
this.argumentName = argumentName;
}
public String getExceptionMsg() {
return exceptionMsg;
}
public void setExceptionMsg(String exceptionMsg) {
}
}
全局异常处理:
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public List<ArgumentsInvalidResponseBean> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException ex){        System.out.println("===================methodArgumentNotValidExceptionHandler Occur====
========");
List<ArgumentsInvalidResponseBean> argumentsInvalidResponseBeanList = new ArrayList<>();
for (FieldError error : ex.getBindingResult().getFieldErrors()){
ArgumentsInvalidResponseBean bean = new ArgumentsInvalidResponseBean();
bean.Field());
bean.DefaultMessage());
argumentsInvalidResponseBeanList.add(bean);
}
return argumentsInvalidResponseBeanList;
}
测试代码:
@RestController
public class CheckController {
@PostMapping("stu")
public String addStu(@Valid @RequestBody StudentBean studentBean){
return "add student success";
}
}
在PostMan中测试:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。