spring boot常见get 、post请求参数处理、参数注解校验、参数自定义注解校验问题解析

 更新时间:2023年09月11日 14:55:43   作者:BraveSoul360  
这篇文章主要介绍了spring boot常见get 、post请求参数处理、参数注解校验、参数自定义注解校验,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

spring boot 常见http get ,post请求参数处理

在定义一个Rest接口时通常会利用GET、POST、PUT、DELETE来实现数据的增删改查;这几种方式有的需要传递参数,后台开发人员必须对接收到的参数进行参数验证来确保程序的健壮性
GET
一般用于查询数据,采用明文进行传输,一般用来获取一些无关用户信息的数据
POST
一般用于插入数据
PUT
一般用于数据更新
DELETE
一般用于数据删除
一般都是进行逻辑删除(即:仅仅改变记录的状态,而并非真正的删除数据)

@PathVaribale 获取url中的数据
@RequestParam 获取请求参数的值
@GetMapping 组合注解,是 @RequestMapping(method = RequestMethod.GET) 的缩写
@RequestBody 利用一个对象去获取前端传过来的数据

PathVaribale 获取url路径的数据

请求URL:localhost:8080/hello/id 获取id值

实现代码如下:

@RestController
public class HelloController {
    @RequestMapping(value="/hello/{id}/{name}",method= RequestMethod.GET)
    public String sayHello(@PathVariable("id") Integer id,@PathVariable("name") String name){
        return "id:"+id+" name:"+name;
    }
}

在浏览器中

输入地址:localhost:8080/hello/100/hello

输出:id:81name:hello

RequestParam 获取请求参数的值

获取url参数值,默认方式,需要方法参数名称和url参数保持一致localhost:8080/hello?id=1000

@RestController
public class HelloController {
    @RequestMapping(value="/hello",method= RequestMethod.GET)
    public String sayHello(@RequestParam Integer id){
        return "id:"+id;
    }
}

输出:

id:100

url中有多个参数时,如:localhost:8080/hello?id=98&&name=helloworld具体代码如下:

@RestController
public class HelloController {
    @RequestMapping(value="/hello",method= RequestMethod.GET)
    public String sayHello(@RequestParam Integer id,@RequestParam String name){
        return "id:"+id+ " name:"+name;
    }
}

获取url参数值,执行参数名称方式localhost:8080/hello?userId=1000

@RestController
public class HelloController {
    @RequestMapping(value="/hello",method= RequestMethod.GET)
    public String sayHello(@RequestParam("userId") Integer id){
        return "id:"+id;
    }
}

输出:

id:100

注意

不输入id的具体值,此时返回的结果为null。具体测试结果如下:id:null不输入id参数,则会报如下错误:whitelable Error Page错误

GET参数校验

用法:不输入id时,使用默认值具体代码如下:localhost:8080/hello

@RestController
public class HelloController {
    @RequestMapping(value="/hello",method= RequestMethod.GET)
    //required=false 表示url中可以无id参数,此时就使用默认参数
    public String sayHello(@RequestParam(value="id",required = false,defaultValue = "1") Integer id){
        return "id:"+id;
    }
}

输出

id:1

POST JSON参数校验

常用校验注解

这里写图片描述

注意:

接收到的参数默认都是字符串类型的

有的注解只能用在String类型的属性上

@JsonProperty可以实现前端的属性名和后台实体类的属性名不一致问题

校验方式:
使用@RequestBody @Valid 对JSON参数进行获取和校验。
通过BindingResult bindingResult 去获取校验结果。

BindingResult 源码:

这里写图片描述

技巧01:利用BindingResult对象的hasErrors方法判断是否有参数错误

技巧02:利用BindingResult对象的getFieldErrors方法获取所有有参数错误的属性

技巧03:利用错误属性对象的getDefaultMessage去获取错误提示信息

@RequestMapping(value = "/demo5",produces = MediaType.TEXT_PLAIN_VALUE)
    @ResponseBody
    public String test5(@RequestBody @Valid  User user , BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            List<ObjectError> objectErrors = bindingResult.getAllErrors();
            System.out.println(objectErrors.toString());
            for(ObjectError objectError: objectErrors){
                System.out.println("objectError = " + objectError.getObjectName());
                System.out.println("objectError = " + objectError.getDefaultMessage());
                System.out.println("objectError = " + objectError.getCode());
                System.out.println("objectError = " + objectError.getArguments());
            }
        }
        String str =  user.toString();
        return str;
    }

对应User实体类代码:

public class User {
    @NotEmpty(message = "ID不能为空")
    @NotBlank(message = "ID不能为空哟")
    private String id;
    @Min(value = 18)
    @Max(value = 30)
    private Integer age;
    @NotEmpty(message = "昵称不能为空")
    @NotBlank(message = "昵称不能为空哟")
    @JsonProperty("nickname") //  当前端属性为nick后台接收对象的属性为nickName时可以用@JsonProperty来保持一致
    private String name;
    ....省略get set方法

自定义注解校验

1、定义一个校验注解

代码如下:

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Constraint(validatedBy = MyFormValidatorClass.class)
public @interface MyFormValidator {
    String value();
    String message() default "name can be test";
    Class<?>[] groups() default {};
    Class<? extends Payload>[]  payload() default {};
}

2、定义一个约束校验

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.annotation.Annotation;
public class MyFormValidatorClass implements ConstraintValidator<MyFormValidator, Object>, Annotation {
    private String values;
    @Override
    public void initialize(MyFormValidator myFormValidator) {
        this.values = myFormValidator.value();
    }
    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        if("test".equals((String)value)){
            return true;
        }
        return false;
    }
    @Override
    public Class<? extends Annotation> annotationType() {
        return null;
    }
}

3、实体类中使用

public class User2 {
    @NotEmpty(message = "ID不能为空")
    @NotBlank(message = "ID不能为空哟")
    //自定义校验注解-校验id是否为test
    @MyFormValidator(value = "abc",message = "dd")
    private String id;
    @Min(value = 18)
    @Max(value = 30)
    private Integer age;
    @NotEmpty(message = "昵称不能为空")
    @NotBlank(message = "昵称不能为空哟")
    @JsonProperty("nickname") //  当前端属性为nick后台接收对象的属性为nickName时可以用@JsonProperty来保持一致

4、测试代码:

@RequestMapping(value = "/demo6",produces = MediaType.TEXT_PLAIN_VALUE)
    @ResponseBody
    public String test6(@RequestBody @Valid User2 user , BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            List<ObjectError> objectErrors = bindingResult.getAllErrors();
            System.out.println(objectErrors.toString());
            for(ObjectError objectError: objectErrors){
                System.out.println("objectError = " + objectError.getObjectName());
                System.out.println("objectError = " + objectError.getDefaultMessage());
                System.out.println("objectError = " + objectError.getCode());
                System.out.println("objectError = " + objectError.getArguments());
            }
        }
        String str =  user.toString();
        return str;
    }

当请求参数ID不为test,objectErrors 中有该报错。

到此这篇关于spring boot常见get 、post请求参数处理、参数注解校验、参数自定义注解校验的文章就介绍到这了,更多相关spring boot参数注解校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java @Value(

    Java @Value("${xxx}")取properties时中文乱码的解决

    这篇文章主要介绍了Java @Value("${xxx}")取properties时中文乱码的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • JAVA使用ffmepg处理视频的方法(压缩,分片,合并)

    JAVA使用ffmepg处理视频的方法(压缩,分片,合并)

    这篇文章主要介绍了JAVA使用ffmepg处理视频的方法,包括视频压缩分片合并功能,通过实例代码讲解的很详细,对java ffmepg处理视频相关知识感兴趣的朋友一起看看吧
    2021-05-05
  • Mybatis的xml中使用if/else标签的具体使用

    Mybatis的xml中使用if/else标签的具体使用

    本文主要介绍了Mybatis的xml中使用if/else标签的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Java实现微信支付的项目实践

    Java实现微信支付的项目实践

    最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,本文就来介绍一下Java实现微信支付的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Springboot内嵌tomcat应用原理深入分析

    Springboot内嵌tomcat应用原理深入分析

    懂得SpringBoot的童鞋应该很清楚,不管应用程序是属于何种类型,都是一个Main方法走遍天下,对于web应用,只需要引入spring-boot-starter-web中这个依赖,应用程序就好像直接给我们来了个tomcat一样,对于嵌入式Tomcat,其实也非常简单,就是调用Tomcat提供的外部类
    2022-09-09
  • Java文件管理操作的知识点整理

    Java文件管理操作的知识点整理

    这篇文章主要为大家详细介绍了Java中文件管理操作的一些知识点和实现方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-09-09
  • Java数据结构之并查集的实现

    Java数据结构之并查集的实现

    并查集是一种用来管理元素分组情况的数据结构。并查集可以高效地进行如下操作。本文将通过Java实现并查集,感兴趣的小伙伴可以了解一下
    2022-01-01
  • 如何通过idea给web项目打war包

    如何通过idea给web项目打war包

    这篇文章主要介绍了如何通过idea给web项目打war包问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java读取Properties文件的七种方法的总结

    Java读取Properties文件的七种方法的总结

    这篇文章主要介绍了Java读取Properties文件的七种方法的总结的相关资料,需要的朋友可以参考下
    2017-07-07
  • MyBatis中$和#的深入讲解

    MyBatis中$和#的深入讲解

    这篇文章主要给大家介绍了关于MyBatis中$和#的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10

最新评论