springboot 入参联动校验 springboot参数校验框架

admin2024-06-11  12

一、Spring Boot 整合持久层技术

1.整合 JDBC

spring boot整合jdbc:

2.整合mybatis

spring boot 整合mybatis

二、SpringBoot 中异常处理与单元测试

1. 异常处理

SpringBoot 中对于异常处理提供了五种处理方式

[1]自定义错误页面

SpringBoot 默认的处理异常的机制:SpringBoot默认的已经提供了一套处理异常的机制。

一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求。在 SpringBoot 中提供了一个名为 BasicErrorController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息。

如 果 我 们 需 要 将 所 有 的 异 常 同 一 跳 转 到 自 定 义 的 错 误 页 面 , 需 要 再src/main/resources/templates 目录下创建 error.html 页面。注意:页面名称必须叫 error。

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_html,第1张

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>异常页面</title>
</head>
<body>
服务器出错,请联系管理员
</body>
</html>

定义一个异常Controller,当其被访问时则会出现空指针异常。用其来测试发生异常时是否会自动跳转至error页面

@Controller
public class UserController {
    @GetMapping("show")
    public String showInfo(){
        String str=null;
        str.length();
        return "success";
    }
}

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_springboot 入参联动校验_02,第2张

[2]通过@ExceptionHandler 注解处理异常

该方式的弊端使用该方式的异常处理类必须要和发生异常的方法处于同一个Controller中
修改Controller

@Controller
public class UserController {

    @GetMapping("show")
    public String showInfo(){
        String str=null;
        str.length();
        return "success";
    }
    
    //value可以赋值多个异常
@ExceptionHandler(value = {java.lang.NullPointerException.class})
    public ModelAndView nullpointExceptionHandler(Exception e){
        ModelAndView mv=new ModelAndView();
        mv.addObject("err",e.toString());
        mv.setViewName("error1");
        return mv;

    }
}

创建异常页面error1

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Title</title>
</head>
<body>
发生异常<span th:text="${err}"></span>
</body>
</html>

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_spring_03,第3张

[3]通过@ControllerAdvice 与@ExceptionHandler 注解处理异常

该方式的缺点:全局异常处理类中处理异常的方法会比较多。
创建全局异常处理类,把Controller中处理空指针异常的方法剪切到该类中

/**
 * 全局异常处理类
 */
@ControllerAdvice
public class GlobalException {

    //value可以赋值多个异常
    @ExceptionHandler(value = {java.lang.NullPointerException.class})
    public ModelAndView nullpointExceptionHandler(Exception e){
        ModelAndView mv=new ModelAndView();
        mv.addObject("err",e.toString());
        mv.setViewName("error1");
        return mv;
    }
}

访问后页面如下

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_springboot 入参联动校验_04,第4张

为了测试效果,修改Controller类,添加一个算术异常。

@GetMapping("show2")
    public String showInfo2(){
        int a=10/0;
        return "success";
    }

修改异常处理类,添加处理算术异常的方法。

@ExceptionHandler(value = {java.lang.ArithmeticException.class})
    public ModelAndView arithmeticException(Exception e){
        ModelAndView mv=new ModelAndView();
        mv.setViewName("error1");
        mv.addObject("err",e.toString());
        return mv;
    }

访问算术异常方法,测试结果

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_spring_05,第5张

[4]通过SimpleMappingExceptionResolver 对象处理异常

该方式的缺点:只能捕获异常并跳转到指定的页面。不能传递异常信息。
创建全局异常处理类

/**
 * 全局异常处理
 */
@Configuration
public class GlobalException2 {

    /**
     * 此方法返回值必须是 SimpleMappingExceptionResolver对象
     * @return
     */
    @Bean
    public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){
        SimpleMappingExceptionResolver resolver=new SimpleMappingExceptionResolver();
        Properties properties=new Properties();
        /**
         * 参数一:异常类型,并且是全名
         * 参数二:视图名称
         */
        properties.put("java.lang.NullPointerException","error2");
        properties.put("java.lang.ArithmeticException","error3");
        resolver.setExceptionMappings(properties);
        return resolver;
    }
}

创建页面处理类
创建error2.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>处理空指针异常</title>
</head>
<body>
发生异常java.lang.NullPointerException
</body>
</html>

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_springboot 入参联动校验_06,第6张

创建error3异常处理类

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>处理算术异常</title>
</head>
<body>
发生异常java.lang.ArithmeticException
</body>
</html>

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_html_07,第7张

[5]通过自定义 HandlerExceptionResolver 对象处理异常

创建全局异常处理类

/**
 * 自定义 HandlerExceptionResolver 对象处理异常
 * 必须要实现 HandlerExceptionResolver
 */
@Configuration
public class GlobalException3 implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, Exception e) {
        ModelAndView mv=new ModelAndView();
        //判断不同的异常类型,做不同视图的跳转
        if (e instanceof NullPointerException){
            mv.setViewName("error1");
        }
        if (e instanceof ArithmeticException){
            mv.setViewName("error4");
        }
        mv.addObject("err",e.toString());
        return mv;
    }
}

前端页面

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Title</title>

</head>
<body>
出现异常<span th:text="${err}"></span>
</body>
</html>

2.Spring Boot 整合 Junit 单元测试

SpringBoot2.x 使用 Junit5 作为测试平台

[1]spring boot中pom文件中默认的Test 启动器配置
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <!--junit-vintage-engine 提供了 Junit3 与 Junit4 的运行平台-->
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
[2]编写测试代码

spring项目中有默认的test类文件,在src/test/java/包下

//springboot的2.x版本中@SpringBootTest注解会默认扫描启动类文件,如果该项目有多个启动类,
//可以用@SpringBootTest(classes = 指定启动类名.class)来指定测试启动类
@SpringBootTest
class SpringbootmybatisApplicationTests {

    @Autowired
    private UserService userService;
    @Test
    void contextLoads() throws SQLException {
        List<Users> users = this.userService.findUsers();
        System.out.println(users);
    }
}

三、Spring Boot 服务端数据校验

1.Spring Boot 对实体对象的校验

注意:最新版springboot 2.3.0中没有@NotNull、@NotBlank等注解

(1)搭建项目环境
[1]创建项目

创建一个包含spring web启动器和thymeleaf启动器的springboot项目

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_springboot 入参联动校验_08,第8张

[2]创建实体
package com.qt.springbootdemo.controller.pojo;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;


public class User {

    private Integer id;
    private String username;
    private String usersex;

    public User( Integer id, String username, String usersex) {
        this.id = id;
        this.username = username;
        this.usersex = usersex;
    }

    public User() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsersex() {
        return usersex;
    }

    public void setUsersex(String usersex) {
        this.usersex = usersex;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", usersex='" + usersex + '\'' +
                '}';
    }
}
[3]创建 Controller
@Controller
@RequestMapping("/user")
public class UserController {
    /**
     * 添加用户
     */
    @RequestMapping("/addUser")
    public String addUser(User user){
        System.out.println(user);
        return "success";
    }
}
[4]创建页面
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<link rel="shortcut icon" href="../resources/favicon.ico"
      th:href="@{/static/favicon.ico}"/>
<head>
    <title></title>
</head>
<body>
<form th:action="@{/user/addUser}" method="post">
    <input type="text" name="username"><br/>
    <input type="text" name="usersex"><br/>
    <input type="submit" value="OK"/>
</form>
</body>
</html>
(2)对实体对象做数据校验
[1]Spring Boot 数据校验的技术特点

Spring Boot 中使用了 Hibernate-validator 校验框架。

[2]对实体对象数据校验步骤

注意:最新版springboot 2.3.0中没有@NotNull、@NotBlank等注解
修改实体类添加校验规则

package com.qt.springbootdemo.controller.pojo;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
 *  @NotNull:对Integer类型做非空校验
 *  @NotBlank:对字符串类型做非空校验
 *  @NotEmpty:对集合类型做非空校验
 */
public class User {
    @NotNull
    private Integer id;
    @NotBlank
    private String username;
    @NotBlank
    private String usersex;

    public User(@NotNull Integer id, @NotBlank String username, @NotBlank String usersex) {
        this.id = id;
        this.username = username;
        this.usersex = usersex;
    }

    public User() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsersex() {
        return usersex;
    }

    public void setUsersex(String usersex) {
        this.usersex = usersex;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", usersex='" + usersex + '\'' +
                '}';
    }
}

在 Controller 中开启校验
开启校验会出现两个结果:有错误和没有错误。
如果前台传输的参数为null,而该参数被@Validated注解验证,则会出现错误,这些错误存放在BindingResult 的对象中

/**
     * 添加用户
     */
    @RequestMapping("/addUser")
    public String addUser(@Validated User user, BindingResult result){
        if (result.hasErrors()){//若result中有值,则说明发送错误
            List<ObjectError> list=result.getAllErrors();//获得错误的集合
            for (ObjectError err:list){//遍历错误
                FieldError fieldError = (FieldError) err;
                String fieldName = fieldError.getField();
                String msg = fieldError.getDefaultMessage();
                System.out.println(fieldName+"\t"+msg);
            }
        }
        System.out.println(user);
        return "success";
    }

我们通过没有参数的路径直接访问该函数

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_html_09,第9张

后台结果为

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_html_10,第10张

我们把打印错误信息的内容注释掉,如果出现错误,则跳转到原添加页面

/**
     * 添加用户
     */
    @RequestMapping("/addUser")
    public String addUser(@Validated User user, BindingResult result){
        if (result.hasErrors()){//若result中有值,则说明发送错误
           /* List<ObjectError> list=result.getAllErrors();//获得错误的集合
            for (ObjectError err:list){//遍历错误
                FieldError fieldError = (FieldError) err;
                String fieldName = fieldError.getField();
                String msg = fieldError.getDefaultMessage();
                System.out.println(fieldName+"\t"+msg);
            }*/
            return "addUser";
        }
        System.out.println(user);
        return "success";
    }

在前端页面中获取提示信息(th:errors=${被检测的类首字母小写.属性})

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<link rel="shortcut icon" href="../resources/favicon.ico" th:href="@{/static/favicon.ico}"/>
<head>
    <title></title>
</head>
<body>
<form th:action="@{/user/addUser}" method="post">
    <input type="text" name="username"><font color="red"><span th:errors="${user.username}" /></font> <br/>
    <input type="text" name="usersex"><font color="red"><span th:errors="${user.usersex}" /></font><br/>
    <input type="submit" value="OK"/>
</form>
</body>
</html>

访问user/AddUser并给参数id=1&username=张三,usersex为空,结果显示

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_spring_11,第11张

[3]自定义错误提示信息

在实体类的注解中定义提示信息

@NotNull(message = "用户ID不能为空")
    private Integer id;
    @NotBlank(message = "用户姓名不能为空")
    private String username;
    @NotBlank(message = "用户性别不能为空")
    private String usersex;

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_springboot 入参联动校验_12,第12张

这样的缺点是不方便管理,我们可以自己建一个常量类,在里面定义字符串

ErrMessage

public class ErrMessage {
	
    public   static final String VALIDATE_MESSAGE_ID="用户id不能为空-M";
    public   static final String VALIDATE_MESSAGE_USERNAME="用户姓名不能为空-M";
    public   static final String VALIDATE_MESSAGE_USERSEX="用户性别不能为空-M";
}

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_springboot 入参联动校验_13,第13张

也可以通过propertis配置文件来配置变量名,配置文件名必须是 ValidationMessages.properties。但是:该方式不支持中文格式,需要把中文字符转换成unicode编码(\u7528\u6237Id\u4e0d\u80fd\u4e3a\u7a7a),比较麻烦。

[4]其他校验规则

@NotNull: 判断基本数据类型的对象类型是否为 null
@NotBlank: 判断字符串是否为 null 或者是空串(去掉首尾空格)。
@NotEmpty: 判断集合是否为空。
@Length: 判断字符的长度(最大或者最小)
@Min: 判断数值最小值
@Max: 判断数值最大值
@Email: 判断邮箱是否合法

(3)解决页面跳转异常

我们创建一个页面跳转Controller(只能通过转发才能访问templates下的资源)

@Controller
public class PageController {
    @RequestMapping("/{path}")
    public String getPath(@PathVariable String path){
        return path;
    }
}

我们直接访问localhost/addUser这个html

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_异常处理_14,第14张

这时会发生异常,告诉我们addUser11行64列出错了

其实出错的地方正是th:errors标记,应为Model中找不到key

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_spring_15,第15张

解决方案:

在页面跳转请求函数中添加被校验实体类的形参,应为SprignMVC 会将该对象放入到 Model 中传递,key 的名称会使用该对象的驼峰命名规则来作为 key,和形参名无关

/**
 * 跳转页面方法
 *解决异常的方式:可以在跳转页面的方法中注入一个 Users 对象
 * 由于 SprignMVC 会将该对象放入到 Model 中传递,key 的名称会使用该对象
 * 的驼峰命名规则来作为 key
 */
@Controller
public class PageController {
    @RequestMapping("/{path}")
    public String getPath(@PathVariable String path, User user){
        return path;
    }
}

2.Spring Boot 对 Controller 中其他参数的校验

[1]编写前端页面
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<link rel="shortcut icon" href="../resources/favicon.ico" th:href="@{/static/favicon.ico}"/>
<head>
    <title>Title</title>
</head>
<body>
<form th:action="@{/user/findUser}">
    <input type="text" value=""><font color="red"><span th:text="${error}"></span></font> <br/>
    <input type="submit" value="查询">
</form>
</body>
</html>
[2]Controller 中开启校验
@Controller
@RequestMapping("user")
@Validated
public class UserController {
[3]对参数指定校验规则
@RequestMapping("findUser")
    public String findUser(@NotBlank(message = "用户名不能为空") String username){
        System.out.println(username);
        return "findUser";
    }
[4]通过全局异常处理来跳转页面
@Configuration
public class GlobalException implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView mv=new ModelAndView();
        if (e instanceof ConstraintViolationException){
            mv.setViewName("findUser");
        }
        mv.addObject("error",e.toString());
        return mv;
    }
}

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_spring_16,第16张

我们可以在异常处理中通过split()截取异常信息

mv.addObject("error",e.toString().split(":")[2]);

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_spring_17,第17张

四、Spring Boot 热部署

1.修改 POM 文件,添加 DevTools 依赖

<!--devYools依赖-->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
		<optional>true</optional>
	</dependency>

2.配置 Idea

[1]设置自动编译

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_spring_18,第18张

[2]设置 Idea 的 Registry

通过快捷键打开该设置项:Ctrl+Shift+Alt+/ 后,点击Registry

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_html_19,第19张

勾选 complier.automake.allow.when.app.running

springboot 入参联动校验 springboot参数校验框架,springboot 入参联动校验 springboot参数校验框架_异常处理_20,第20张

完成热部署配置后,以后修改前端或后端代码,就无需再重启项目。

修改完代码后,在你下一次用浏览器请求该项目时,项目会自动重新部署。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!