使用BindingResult 自定义错误信息

目录
  • BindingResult 自定义错误信息
    • 前提概要
    • 基础框架
    • 配置文件和Java代码的修改
    • 在Controller方法中指定需要进行校验
    • 进行自定义校验
    • 在JSP页面上显示校验错误信息
  • BindingResult错误返回显示失败

BindingResult 自定义错误信息

前提概要

在Spring MVC和FreeMarker整合的项目中,采用JSR-303验证框架,通过注解的方式进行数据验证

基础框架

MVC:Spring MVC 3

视图:FreeMarker

验证:Hibernate-validator实现

配置文件和Java代码的修改

在Spring MVC配置文件中添加配置

添加以下mvc的注解驱动配置,一切变成“自动化”

<mvc:annotation-driven />  

在JavaBean中添加数据校验的注解

其中@Length、@email就是Hibernate-validator中的数据校验注解,还可以用javax.validation中的注解,比如@NotNull

public class SystemUser {
    @Length(min = 5, max = 20, message = "用户名长度必须位于5到20之间")
    private String userName;
    @Email(message = "比如输入正确的邮箱")
    private String email;
}  

在Controller方法中指定需要进行校验

首先,要在需要进行校验的Bean前面加上@Valid注解,告诉SpringMVC框架这个Bean需要进行校验;

同时,还要在需要校验的Bean前面加上@modelattribute注解,从而将Bean暴露给视图,并且指定名字,这有两个作用,第一是显示校验错误需要使用这个名字,第二个是返回原来的页面以后,前面输入的所有值还要显示出来;

其次,每个需要校验的Bean后面紧跟一个BindingResult,SpringMVC框架会将校验结果保存在它里面,通过hasErrors方法可以判断是否有校验错误;

最后,当返回到原页面以后,SpringMVC框架还会将所有校验错误信息保存在上下文中,供页面上取得校验错误,Spring提供了一套JSP自定义标签。

@RequestMapping(value = "/create.html", method = RequestMethod.POST)
public String doCreateUser(
        @Valid @ModelAttribute("userDetail") SystemUser user,
        BindingResult bindingResult,
        HttpServletRequest request) {
    // 如果有校验错误,返回添加用户的页面
    if (bindingResult.hasErrors()) {
        return "/user/create";
    }
    this.userService.createUser(user);
    return "/user/list.html";
}  

进行自定义校验

如果需要添加自定义校验,比如验证用户名是否已经被使用了,那么简单的注解自然无能为力,需要自己编码实现,如果校验失败,可以手动将自定义校验错误添加到BindingResult中。

@RequestMapping(value = "/user/create.html", method = RequestMethod.POST)
public String doCreateUser(
        @Valid @ModelAttribute("userDetail") SystemUser user,
        BindingResult bindingResult,
        HttpServletRequest request) {
    // 如果有数据校验错误,返回添加用户的页面
    if (bindingResult.hasErrors()) {
        return "/user/create";
    }
    boolean isUserNameExist = this.userService.checkUserByUserName(user.getUserName());
    // 如果用户名已存在,返回添加用户的页面
    if (isUserNameExist) {
        // 向BindingResult添加用户已存在的校验错误
        bindingResult.rejectValue("userName", "该用户名已存在", "该用户名已存在");
        return "/user/create";
    }
    this.userService.createUser(user);
    return "/user/list.html";
}

在JSP页面上显示校验错误信息

返回页面以后,SpringMVC框架将所有校验错误信息都放在了上下文中,可以自己去取出来,但是那样非常麻烦,不过没关系,Spring提供了一套自定义标签,可以方便的显示校验错误信息。

页面头部需要导入Spring的自定义标签库

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

需要一次性显示全部校验错误

(commandName的值就是@modelattribute注解中指定的值)

<form:form commandName="userDetail">
<form:errors path="*" cssStyle="color:red"></form:errors>
</form:form> 

需要在对应输入框的后面显示单个校验错误

(通过path指定显示那个具体的校验错误,userDetail正是@modelattribute注解中指定的值,而点号后面则是指定显示Bean中哪个属性的校验错误)

<input type="text" name="userName" value="${userDetail.userName}" >
<form:errors path="userDetail.userName" cssStyle="color:red"></form:errors>
<input type="text" name="email" value="${userDetail.email}">
<form:errors path="userDetail.email" cssStyle="color:red"></form:errors> 

BindingResult错误返回显示失败

作为一个初学者经常犯低级错误,特别是没有老师的情况下。绊了一整天,不过找到原因了

如果redirect跳转回造成参数丢失

此时可以设置返回参数为Object

@RequestMapping(value = "/save", method = RequestMethod.POST)
public Object test(HttpServletRequest request, Model model, @Validated User user, BindingResult bindingResult)
throws Exception {
if (bindingResult.hasErrors()) {
return "user/save";
}
user.setVersion(0);
return new ModelAndView("redirect:/user/list");
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • JSR303校验注解和自定义校验注解的使用

    引入validation依赖 <!--JSR303依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> Null检查 @Null(message = "")       验证对象是否为null

  • SpringBoot后端进行数据校验JSR303的使用详解

    如果只想查看注解,请跳到文章末尾部分 简介 在前后端进行数据交互中,在前端把数据传送到后端前,一般会先进行校验一次,校验成功之后,才把数据发送到后端.但是我们在服务端还得在对数据进行一次校验.因为请求数据发送的链接很容易获取,可以不经过前端界面,使用postman等工具直接向后台发送数据,这就可能造成发送的数据是不合法的情况. 项目创建 首先创建一个springboot项目 使用的springboot版本为:(本文代码以该版本为准,不同版本springboot,在下面内容会出现一些差异) <pa

  • SpringBoot如何优雅的处理校验参数的方法

    前言 做web开发有一点很烦人就是要校验参数,基本上每个接口都要对参数进行校验,比如一些格式校验 非空校验都是必不可少的.如果参数比较少的话还是容易 处理的一但参数比较多了的话代码中就会出现大量的IF ELSE就比如下面这样: 这个例子只是校验了一下空参数.如果需要验证邮箱格式和手机号格式校验的话代码会更多,所以介绍一下validator通过注解的方式进行校验参数. 什么是Validator Bean Validation是Java定义的一套基于注解的数据校验规范,目前已经从JSR 303的1.

  • 使用BindingResult 自定义错误信息

    目录 BindingResult 自定义错误信息 前提概要 基础框架 配置文件和Java代码的修改 在Controller方法中指定需要进行校验 进行自定义校验 在JSP页面上显示校验错误信息 BindingResult错误返回显示失败 BindingResult 自定义错误信息 前提概要 在Spring MVC和FreeMarker整合的项目中,采用JSR-303验证框架,通过注解的方式进行数据验证 基础框架 MVC:Spring MVC 3 视图:FreeMarker 验证:Hibernat

  • laravel dingo API返回自定义错误信息的实例

    laravel 在使用了 dingo API 后,错误信息被dingo异常类接管了,返回信息变成了 : 要返回自定义的错误信息,就需要再把错误异常类接管回来(大概这个意思...) 方法: 在 app\Providers\AppServiceProvider.php 中的 boot() 方法 添加如下代码: app('api.exception')->register(function (\Exception $exception) { $request = Request::capture();

  • ASP.NET中MVC使用AJAX调用JsonResult方法并返回自定义错误信息

    一.如何用AJAX调用JsonResult方法 比如FuckController中添加有个返回JsonResult类型的方法FuckJson(): 复制代码 代码如下: <span class="kwd">public<span class="pln"> <span class="typ">JsonResult<span class="pln"> <span class=&

  • Jquery ajax执行顺序 返回自定义错误信息(实例讲解)

    1.多个Ajax 在一个function中的执行顺序 由于Jquery中的Ajax的async默认是true(异步请求),如果想一个Ajax执行完后再执行另一个Ajax, 需要把async=false就可以了. 复制代码 代码如下: function TestAjax(){            var UserName = $("#txtUserName").val();            $.ajax(            {                url: &quo

  • .NET Core授权失败自定义响应信息的操作方法

    前言 在.NET 5之前,当授权失败即403时无法很友好的自定义错误信息,以致于比如利用Vue获取到的是空响应,不能很好的处理实际业务,同时涉及到权限粒度控制到控制器.Action,也不能很好的获取对应路由信息.本文我们来看看在.NET 5中为何要出现针对授权失败的中间件接口?它是如何一步步衍生出来的呢?以及对于授权失败根据实际需要如何自定义响应错误,以及如何获取对应路由信息等等 授权失败自定义响应信息 如下是在.NET 5之前,对于授权处理,我们大多实现自定义的AuthorizationHan

  • spring boot自定义404错误信息的方法示例

    前言 本文将给大家简单介绍一下,在springboot中怎么个性化404错误信息,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 返回json @Bean public EmbeddedServletContainerCustomizer containerCustomizer() { return new EmbeddedServletContainerCustomizer(){ @Override public void customize(ConfigurableEmbe

  • Spring Boot 如何自定义返回错误码错误信息

     说明 •在实际的开发过程中,很多时候要定义符合自己业务的错误码和错误信息,而不是统一的而不是统一的下面这种格式返回到调用端 INTERNAL_SERVER_ERROR(500, "Internal Server Error"), 下面我们来看看如何将我们自定义的错误码和错误信息返回到调用端. 1 自定义错误码 •首先我们要定义一个枚举类 public enum ErrorEnum { /* * 错误信息 * */ E_20011(20011, "缺少必填参数"),

  • SpringBoot多种自定义错误页面方式小结

    目录 以前web.xml方式 SpringBoot中实现方式 1.实现EmbeddedServletContainerCustomizer的bean 2.通过拦截器方式 3.自定义静态error页面方法 在项目中为了友好化,对于错误页面,我们常常会使用自定义的页面.SSM框架组合时代,我们通常通过拦截或者在web.xml中设置对于错误码的错误页面,然而到了SpringBoot,web.xml消失了,SpringBootServletInitializer初始化servlet代替了web.xml.

  • 微信企业号 根据错误码返回错误信息类封装

    微信企业号根据错误码返回错误信息类封装 微信开发中返回错误码每次需要查询错误返回码文档才知道具体的错误信息(查看返回的errormsg也可知道),因此封装一个 错误码返回的类来查看! 纯粹的体力劳动!!! <span style="font-size:14px;">package org.oms.wechat.utils; /** * 企业号根据错误码返回错误信息类 * @author sunlight * */ public class ErrorCodeText { p

  • ASP.NET MVC自定义错误页面真的简单吗?

    如果你在设置asp.net mvc自定义错误页面时遇到问题,这并不止你一个人.惊讶之余你的做法是正确的,没有起到作用的原因是其一部分错误是由asp.net管道处理的,另一部分是由iis直接处理. 通常情况 (我期望是这种情况,在一些其他框架/服务器上) 我们只需要在一个地方配置自定义错误页就可以了,无论怎么哪儿引发的错误.就像这样︰ <customErrors mode="On"> <error code="404" path="404.

随机推荐