SpringMVC使用@Valid注解进行数据验证的方法

我们在做Form表单提交的时候,只在前端做数据校验是不够安全的,所以有时候我们需要在后端同样做数据的校验。好在SpringMVC在后台验证给我们提供了一个比较好的支持。那就是使用Valid接口的实现类做数据校验。在这之前我们先做一下准备的工作。

添加相关的Maven依赖

我们先把需要的jar包添加进来。

<dependency>
  <groupId>javax.validation</groupId>
  <artifactId>validation-api</artifactId>
  <version>1.1.0.Final</version>
</dependency>
<dependency>
  <groupId>org.apache.bval</groupId>
  <artifactId>bval-jsr303</artifactId>
  <version>0.5</version>
</dependency> 

实现Validator接口

接下来的第一 步我们需要写一个类来实现Validator接口。在这个类里我们需要定义它支持校验的JavaBean,实现validate方法,用来进行相关的校验。具体的实现类如下:

package com.zkn.learnspringmvc.validtor; 

import com.zkn.learnspringmvc.scope.PersonScope;
import org.springframework.util.StringUtils;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator; 

/**
 * Created by wb-zhangkenan on 2016/9/2.
 */
public class PersonalValidtor implements Validator{ 

  /**
   * 判断支持的JavaBean类型
   * @param aClass
   * @return
   */
  @Override
  public boolean supports(Class<?> aClass) {
    return PersonScope.class.equals(aClass);
  } 

  /**
   * 实现Validator中的validate接口
   * @param obj
   * @param errors
   */
  @Override
  public void validate(Object obj, Errors errors) {
    //把校验信息注册到Error的实现类里
    ValidationUtils.rejectIfEmpty(errors,"name",null,"姓名不能为空!");
    PersonScope personScope = (PersonScope) obj;
    if(StringUtils.isEmpty(personScope.getAddress())){
      errors.rejectValue("address",null,"家庭地址不能为空!!!!");
    }
  }
}

使用Validtor的校验实现类

我们需要在Controller的类里使用刚才写的Validtor的校验实现类来进行表单数据的校验。我们需要在Controller里用@InitBinder注解把刚才的校验类绑定到WebDataBinder类里。写法如下:

//绑定PersonalValidator
@InitBinder
public void initBinder(WebDataBinder webDataBinder){
  webDataBinder.addValidators(new PersonalValidtor());
} 

接下来我们需要在@RequestMapping这个注解所在的方法上使用@Valid注解进行数据的校验。

@RequestMapping(value = "testPersonalValidtor.do")
@ResponseBody
//直接返回对象
public Object testPersonalValidtor(@Valid PersonScope personScope, BindingResult bindingResult){
  if(bindingResult.hasErrors()){
    StringBuffer sb = new StringBuffer();
    for(ObjectError objectError : bindingResult.getAllErrors()){
      sb.append(((FieldError)objectError).getField() +" : ").append(objectError.getDefaultMessage());
    }
    return sb.toString();
  }else{
    return personScope;
  }
}

接下来我们来看一下效果:

请求:http://localhost:8081/testPersonalValidtor.do

结果:

请求:http://localhost:8081/testPersonalValidtor.do?name=张三&address=三元桥

结果:

具体Controller类代码如下:

package com.zkn.learnspringmvc.news.controller; 

import com.alibaba.fastjson.JSON;
import com.zkn.learnspringmvc.scope.PersonScope;
import com.zkn.learnspringmvc.validtor.PersonalValidtor;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; 

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; 

/**
 * 用来测试PersonalValidator的控制器
 * Created by wb-zhangkenan on 2016/9/2.
 */
@Controller
public class TestPersonlalValidtorController { 

  //绑定PersonalValidator
  @InitBinder
  public void initBinder(WebDataBinder webDataBinder){
    webDataBinder.addValidators(new PersonalValidtor());
  } 

  @RequestMapping(value = "testPersonalValidtor.do")
  @ResponseBody
  //直接返回对象
  public Object testPersonalValidtor(@Valid PersonScope personScope, BindingResult bindingResult){
    if(bindingResult.hasErrors()){
      StringBuffer sb = new StringBuffer();
      for(ObjectError objectError : bindingResult.getAllErrors()){
        sb.append(((FieldError)objectError).getField() +" : ").append(objectError.getDefaultMessage());
      }
      return sb.toString();
    }else{
      return personScope;
    }
  }
}

PersonScope实体类:

package com.zkn.learnspringmvc.scope; 

import java.io.Serializable; 

/**
 * Person对象
 * @author zkn
 *
 */ 

public class PersonScope implements Serializable{ 

  /**
   * 序列
   */
  private static final long serialVersionUID = 1L;
  /**
   * 姓名
   */
  private String name;
  /**
   * 年龄
   */
  private Integer age;
  /**
   * 家庭地址
   */
  private String address; 

  private StudentScope studentScope; 

  public String getName() {
    return name;
  } 

  public void setName(String name) {
    this.name = name;
  } 

  public Integer getAge() {
    return age;
  } 

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

  @Override
  public String toString() {
    return "PersonDomain [name=" + name + ", age=" + age + "]";
  } 

  public StudentScope getStudentScope() {
    return studentScope;
  } 

  public void setStudentScope(StudentScope studentScope) {
    this.studentScope = studentScope;
  } 

  public String getAddress() {
    return address;
  } 

  public void setAddress(String address) {
    this.address = address;
  }
}

这里需要注意的是:@Valid要紧挨着JavaBean(即PersonScope),要不然不会生效的。

另外需要注意的是:这里的校验是哪个请求需要校验,就写在哪个请求上。如果需要配置全局的校验的话,可以在<mvc:annotation-driven/>中配置validator。写法如下:

<mvc:annotation-driven validator="personalValidtor"> 

<bean id="personalValidtor" class="com.zkn.learnspringmvc.validtor.PersonalValidtor"/>

使用<form:errors />标签

上面的错误信息的展示是我们自己来展示的错误信息,但是SpringMVC还给我们提供了一个<form:errors />标签来展示错误信息。例子如下:

@RequestMapping(value = "testPersonalValidtor02.do")
public Object testPersonalValidtor01(@Valid PersonScope personScope, BindingResult bindingResult){
  if(bindingResult.hasErrors()){
    return "error";
  }else{
    return "home";
  }
} 

jsp页面内容如下:

<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@page pageEncoding="utf-8" contentType="text/html;utf-8"%> 

<form:errors path="personScope.name"/>

注意:<form:errors />标签是SpringMVC提供的,所以我们得引入这个标签库

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

效果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解SpringMVC学习系列(6) 之 数据验证

    在系列(4).(5)中我们展示了如何绑定数据,绑定完数据之后如何确保我们得到的数据的正确性?这就是我们本篇要说的内容 -> 数据验证. 这里我们采用Hibernate-validator来进行验证,Hibernate-validator实现了JSR-303验证框架支持注解风格的验证.首先我们要到http://hibernate.org/validator/下载需要的jar包,这里以4.3.1.Final作为演示,解压后把hibernate-validator-4.3.1.Final.jar.jb

  • ASP.NET MVC 数据验证及相关内容

    一.数据验证 数据验证的步骤在模型类中添加与验证相关的特性标记在客户端导入与验证相关的js文件和css文件使用与验证相关的Html辅助方法在服务器端判断是否通过服务器端验证常用的验证标记 Required:非空验证StringLength:验证字符串的长度RegularExpression:正则表达式验证Compare:比较两个字段的值是否相等Range:范围验证Remote:服务器验证(需要在controller中编写返回值为JsonResult的Action)自定义验证标记与验证相关的js文

  • MVC数据验证详解

    一.一般情况 对于使用过MVC框架的人来说,对MVC的数据验证不会陌生,比如,我有一个Model如下: public class UserInfo { [Required(ErrorMessage = "UserName不可为空1111")] public string UserName { get; set; } public string Sex { get; set; } public string Mobile { get; set; } public string Addre

  • SpringMVC使用@Valid注解进行数据验证的方法

    我们在做Form表单提交的时候,只在前端做数据校验是不够安全的,所以有时候我们需要在后端同样做数据的校验.好在SpringMVC在后台验证给我们提供了一个比较好的支持.那就是使用Valid接口的实现类做数据校验.在这之前我们先做一下准备的工作. 添加相关的Maven依赖 我们先把需要的jar包添加进来. <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api<

  • JAVA中通过自定义注解进行数据验证的方法

    前言 最近为了工作也为了更加深入了解掌握java注解的使用,决定自定义注解来实现数据验证. API开发中经常会遇到一些对请求数据进行验证的情况,这时候如果使用注解就有两个好处,一是验证逻辑和业务逻辑分离,代码清晰,二是验证逻辑可以轻松复用,只需要在要验证的地方加上注解就可以. Java提供了一些基本的验证注解,比如@NotNull.@Size,但是更多情况下需要自定义验证逻辑,这时候就可以自己实现一个验证注解,方法很简单,仅需要两个东西: 一个自定义的注解,并且指定验证器 一个验证器的实现 自定

  • Java使用@Validated注解进行参数验证的方法

    目前项目中大部分代码进行参数验证都是写代码进行验证,为了提升方便性和代码的简洁性,所以整理了下使用注解进行参数验证.使用效果如下: // 要验证的实体类 @Data public class User implements Serializable { @NotBlank(message = "id不能为空!",groups = Update.class) protected String id = ""; @NotBlank(message = "商户i

  • Spring Boot 通过注解实现数据校验的方法

    一.依赖 <!--https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> &l

  • Spring MVC Annotation验证的方法

    简介说明 使用Spring MVC的Annotation验证可以直接对view model的简单数据验证,注意,这里是简单的,如果model的数据验证需要有一些比较复杂的业务逻辑性在里头,只是使用annotation做验证是比较难的. 以下是使用Spring MVC自带的annotation验证,加上自定义的一个@Tel的annotation验证例子,此例子具有: 1.支持多语言(国际化) 2.对默认数据先进行转化,比如int.date类型如果传入空值时,会抛异常,默认给定值 先看配置: 1.w

  • SpringMVC实现注解式权限验证的实例

    对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servlet中的过滤器Filter来实现.但借助于Spring MVC中的action拦截器我们可以实现注解式的权限验证. 一.首先介绍一下action拦截器: HandlerInterceptor是Spring MVC为我们提供的拦截器接口,来让我们实现自己的处理逻辑,HandlerInterceptor 的内容如下: public interface Handl

  • 如何使用SpringBoot进行优雅的数据验证

    JSR-303 规范 在程序进行数据处理之前,对数据进行准确性校验是我们必须要考虑的事情.尽早发现数据错误,不仅可以防止错误向核心业务逻辑蔓延,而且这种错误非常明显,容易发现解决. JSR303 规范(Bean Validation 规范)为 JavaBean 验证定义了相应的元数据模型和 API.在应用程序中,通过使用 Bean Validation 或是你自己定义的 constraint,例如 @NotNull, @Max, @ZipCode , 就可以确保数据模型(JavaBean)的正确

  • SpringMVC中@Valid不起效BindingResult读取不到Error信息

    目录 Bug记录 首先检查jar包的导入 检查Bean实体类的注解 检查Springmvc的配置 检查View层的Spring MVC表单标签 检查JDK版本 总结 Bug记录 在写SpringMVC项目时,由于要对表单数据进行校验,使用Spring MVC框架时,有两种 常用的方式校验输入的数据. 利用Spring框架自带的验证框架 利用JSR 303实现 我使用的是JSR 303实现数据校验的,JSR 303 通过在Bean属性上标注类似于@NotNull.@Max等标准的注解指定校验规则,

  • springboot @Valid注解对嵌套类型的校验功能

    @Valid注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则,而在API接收数据时添加@valid关键字,这时你的实体将会开启一个校验的功能,具体的代码如下,是最基本的应用: 实体: public class DepartmentDto { @ApiModelProperty("id") private String id; @ApiModelProperty("上级Id") private String parentId; @ApiModelPr

随机推荐