在之前的程序里面如果一旦出现了错误之后就会出现一堆的大白板,这个白板会有一些错误信息,
在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 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