Springboot 错误处理

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

在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 里面


    org.springframework.boot
    spring-boot-starter-thymeleaf

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




    
    SpringBoot 模板渲染


  
      用户邮箱:
      用户年龄: 
      用户工资  
      用户生日  
      
      
  


点击提交 你会看到时间为

Springboot 错误处理_第1张图片

因为在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 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

你可能感兴趣的:(Spring,Springboot)