Springboot 错误处理

本文详细介绍了SpringBoot中数据验证的实现方式,包括实体类字段的注解验证、错误信息的定制化展示以及如何处理验证错误。通过示例代码展示了如何使用hibernate-validator进行数据校验,并解释了如何配置和读取错误信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在之前的程序里面如果一旦出现了错误之后就会出现一堆的大白板,这个白板会有一些错误信息,

在Springboot里面针对于错误的处理一共提供有三种方式 数据验证错误 错误页面指派以及全局异常的处理.
我们先谈谈数据验证,做个准备工作 表单页面 表单数据提交到实体类里面 代码如下 实体类如下

 package com.fabu.demo6.vo;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;


   public class Member implements Serializable {
    private String  id;
    private Integer  age;
    private Double   salary;
    private Date birathday;


    public Date getBirathday() {
        return birathday;
    }


    public void setBirathday(Date birathday) {
        this.birathday = birathday;
    }


    public String getId() {
        return id;
    }


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


    public Integer getAge() {
        return age;
    }


    public void setAge(Integer age) {
        this.age = age;
    }


    public Double getSalary() {
        return salary;
    }


    public void setSalary(Double salary) {
        this.salary = salary;
    }


    @Override
    public String toString() {
        return "Member{" +
                "id='" + id + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                ", birathday=" + birathday +
                '}';
    }
}

由于此时的程序之中需要进行日期的转换处理操作,那么就需要为其做一个转换处理的格式配置

package com.fabu.demo6.basecontroller;

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;

import java.text.SimpleDateFormat;
import java.util.Date;

/******
* 处理 controller 公共的东西 做一个抽象类存在
*/
public abstract  class AbstractBaseController  {

    /****
     * 处理时间
     * @param binder
     */
@InitBinder
   public void initBinder(WebDataBinder binder){
     //首先建立一个可以将字符串转换为日期的工具程序 yyyy-MM-dd HH:mm:ss yyyy-MM-dd HH:mm:SS
      SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
      //明确的描述此时需要注册一个日期格式的转化处理程序类
      CustomDateEditor cu=  new CustomDateEditor(sdf,true);
      binder.registerCustomEditor(Date.class,cu);
  }
}

建立一个MemberController 程序类 负责实现Member 控制层处理操作

package com.fabu.demo6.controller;

import com.fabu.demo6.basecontroller.AbstractBaseController;
import com.fabu.demo6.vo.Member;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
/*****
* 控制层
*/
@Controller
public class MemberController extends AbstractBaseController  {

    /*****
     * 跳转到指定页面去
     * @return
     */
    @RequestMapping(value = "/toAddMeber",method = RequestMethod.GET)
    public  String toAddMeber(){
         return  "member_add"; //建立一个名字为member_add的模板页面
     }

     @RequestMapping(value = "/add",method = RequestMethod.POST)
     @ResponseBody
     public Object add(Member vo){
         return  vo;
     }

}

4.0 编写一个页面进行用户的表单填写 这里会用到模板 修改pom.xml 里面

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

5.0 编写页面 页面名字为 member_add 存放在templates 下面

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
    <title>SpringBoot 模板渲染</title>
</head>
<body>
  <form action="/add" method="post">
      用户邮箱:<input type="text" name="id" value="zw@163.com">
      用户年龄: <input type="text" name="age" value="16">
      用户工资  <input type="text" name="salary" value="55555.12">
      用户生日  <input type="text" name="birathday" value="2018-12-23">
      <input type="submit" value="提交"/>
      <input type="reset" value="重置"/>
  </form>
</body>
</html>

点击提交 你会看到时间为

因为在springboot 2.0 改一些东西 所以在配置文件上面 我这里是yml 格式的

spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

在重新启动 在访问一下

6.0 此时的代码只是一个最为普通的处理操作 ,如果某些数据不输入 则内容是空 要进行严格的控制 这些null 是不可以存在的
比如用户名必须是邮箱才行 这些验证 。在Springboot 里面有默认的支持,只不过这种支持有点差距,Springboot 提供用户编写验证专门提供有一个hibernate-validation.jar 工具包,这个工具包由hibernate 开发框架提供的

 

7.0 如果要想进行验证,那么首先要解决的问题就必须是错误的提示信息问题,在spring boot里面对于错误信息的保存,都要求其保存在xxxx.properties 文件 ,在src/main/resources 目录中

member.id.notnull.error=用户不可以为空
member.id.email.error=用户名注册必须输入正确的邮箱
member.id.length.error=用户名格式错误
member.age.notnull.error=年龄不可以为空
member.age.digits.error=年龄必须是合法数字
member.salary.notnull.error=工资不可以为空
member.salary.digits.error=工资必须是合法数字
member.birthday.notnull.error=生日不可以为空

一个表单就这样了 如果几千个表单 那不是搞死人吗? 所以建议利用拦截器去做处理
8.0 修改实体类 进行验证处理方式

package com.fabu.demo6.vo;

import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.Digits;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;

public class Member implements Serializable {


    //{}
    @NotNull(message = "{member.id.notnull.error}")
    @Email(message = "{member.id.email.error}")
    @Length(min = 5,message ="{member.id.length.error}" )
    private String  id;
    @NotNull(message = "{member.age.notnull.error}")
    @Digits(integer=3,fraction = 0,message = "{member.age.digits.error}")
    private Integer  age;
    @NotNull(message = "{member.salary.notnull.error}")
    @Digits(integer=20,fraction = 2,message = "{member.salary.digits.error}")
    private Double   salary;
    @NotNull(message = "{member.birathday.notnull.error}")
    private Date birathday;

    public Date getBirathday() {
        return birathday;
    }

    public void setBirathday(Date birathday) {
        this.birathday = birathday;
    }

    public String getId() {
        return id;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Member{" +
                "id='" + id + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                ", birathday=" + birathday +
                '}';
    }
}

修改控制层add方法来观察错误的信息的显示

package com.fabu.demo6.controller;

import com.fabu.demo6.basecontroller.AbstractBaseController;
import com.fabu.demo6.vo.Member;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.validation.Valid;
import java.util.Iterator;

/*****
* 控制层
*/
@Controller

public class MemberController extends AbstractBaseController  {

    /*****
     * 跳转到指定页面去
     * @return
     */
    @RequestMapping(value = "/toAddMeber",method = RequestMethod.GET)
    public  String toAddMeber(){
         return  "member_add"; //建立一个名字为member_add的模板页面
     }

     @RequestMapping(value = "/add",method = RequestMethod.POST)
     @ResponseBody
     public Object add(@Valid  Member vo, BindingResult result){
        if(result.hasErrors()){ //现在表示执行的验证出现错误
            //获取全部错误信息
            Iterator<ObjectError> iterable=result.getAllErrors().iterator();
            while (iterable.hasNext()){
                ObjectError error=iterable.next(); //取出每一个错误
                String str=error.getDefaultMessage();
                System.out.println("[错误信息code=]"+error.getCode()+" , message= "+error.getDefaultMessage());
            }
            return  result.getAllErrors();
        }
         else{
            return  vo;
        }
     }

}

有可能出现乱码情况 建议 yml 格式里面配置一下

spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
  http:
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  messages:
    encoding: UTF-8
server:
  tomcat:
    uri-encoding: UTF-8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟子涵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值