•   欢迎来到21NN网.
  •   请记住本站网址www.21nn.cn

spring validation作为数据校验的要领引见(附代码)【JAVA教程】,springboot,spring,java

摘要: 本篇文章给人人带来的内容是关于springvalidation作为数据校验的要领引见(附代码),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。数据的校验是交互式网站一个不可或...
本篇文章给人人带来的内容是关于spring validation作为数据校验的要领引见(附代码),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。

数据的校验是交互式网站一个不可或缺的功用,前端的js校验能够涵盖大部分的校验职责,如用户名唯一性,生日花样,邮箱花样校验等等经常运用的校验。然则为了防备用户绕过浏览器,运用http东西直接向后端要求一些违法数据,服务端的数据校验也是必要的,能够防备脏数据落到数据库中,假如数据库中涌现一个不法的邮箱花样,也会让运维职员头疼不已。

JSR303/JSR-349,hibernate validation,spring validation之间的关联。JSR303是一项范例,JSR-349是其的升级版本,增加了一些新特征,他们划定一些校验范例即校验注解,如@Null,@NotNull,@Pattern,他们位于javax.validation.constraints包下,只供应范例不供应完成。而hibernate validation是对这个范例的实践(不要将hibernate和数据库orm框架联络在一起),他供应了响应的完成,并增加了一些其他校验注解,如@Email,@Length,@Range等等,他们位于org.hibernate.validator.constraints包下。而全能的spring为了给开辟者供应便利,对hibernate validation举行了二次封装,显现校验validated bean时,你能够运用spring validation或许hibernate validation,而spring validation另一个特征,就是其在springmvc模块中增加了自动校验,并将校验信息封装进了特定的类中。这无疑便利了我们的web开辟。本文重要引见在springmvc中自动校验的机制。

引入依靠
我们运用maven构建springboot应用来举行demo演示。

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

我们只须要引入spring-boot-starter-web依靠即可,假如检察其子依靠,能够发明以下的依靠:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

考证了我之前的形貌,web模块运用了hibernate-validation,而且databind模块也供应了响应的数据绑定功用。

构建启动类

无需增加其他注解,一个典范的启动类

@SpringBootApplication
public class ValidateApp {

    public static void main(String[] args) {
        SpringApplication.run(ValidateApp.class, args);
    }
}

建立须要被校验的实体类

public class Foo {

    @NotBlank
    private String name;

    @Min(18)
    private Integer age;

    @Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "手机号码花样毛病")
    @NotBlank(message = "手机号码不能为空")
    private String phone;

    @Email(message = "邮箱花样毛病")
    private String email;

    //... getter setter

}

运用一些比较经常运用的校验注解,照样比较浅显易懂的,字段上的注解称号即可推断出校验内容,每个注解都包含了message字段,用于校验失利时作为提醒信息,特别的校验注解,如Pattern(正则校验),还能够本身增加正则表达式。

在@Controller中校验数据

@Controller
public class FooController {

    @RequestMapping("/foo")
    public String foo(@Validated Foo foo <1>, BindingResult bindingResult <2>) {
        if(bindingResult.hasErrors()){
            for (FieldError fieldError : bindingResult.getFieldErrors()) {
                //...
            }
            return "fail";
        }
        return "success";
    }

}

值得注重的处所:

<1> 参数Foo前须要加上@Validated注解,表明须要spring对其举行校验,而校验的信息会存放到厥后的BindingResult中。注重,必需相邻,假如有多个参数须要校验,情势能够以下。foo(@Validated Foo foo, BindingResult fooBindingResult ,@Validated Bar bar, BindingResult barBindingResult);即一个校验类对应一个校验效果。

<2> 校验效果会被自动添补,在controller中能够依据营业逻辑来决议细致的操纵,如跳转到毛病页面。

一个最基本的校验就完成了,总结下框架已供应了哪些校验:

JSR供应的校验注解:         
@Null   被解释的元素必需为 null    
@NotNull    被解释的元素必需不为 null    
@AssertTrue     被解释的元素必需为 true    
@AssertFalse    被解释的元素必需为 false    
@Min(value)     被解释的元素必需是一个数字,其值必需大于即是指定的最小值    
@Max(value)     被解释的元素必需是一个数字,其值必需小于即是指定的最大值    
@DecimalMin(value)  被解释的元素必需是一个数字,其值必需大于即是指定的最小值    
@DecimalMax(value)  被解释的元素必需是一个数字,其值必需小于即是指定的最大值    
@Size(max=, min=)   被解释的元素的大小必需在指定的范围内    
@Digits (integer, fraction)     被解释的元素必需是一个数字,其值必需在可接受的范围内    
@Past   被解释的元素必需是一个过去的日期    
@Future     被解释的元素必需是一个未来的日期    
@Pattern(regex=,flag=)  被解释的元素必需相符指定的正则表达式    


Hibernate Validator供应的校验注解:  
@NotBlank(message =)   考证字符串非null,且长度必需大于0    
@Email  被解释的元素必需是电子邮箱地址    
@Length(min=,max=)  被解释的字符串的大小必需在指定的范围内    
@NotEmpty   被解释的字符串的必需非空    
@Range(min=,max=,message=)  被解释的元素必需在适宜的范围内

分组校验

假如同一个类,在差别的运用场景下有差别的校验划定规矩,那末能够运用分组校验。未成年人是不能饮酒的,而在其他场景下我们不做特别的限制,这个需求怎样表现同一个实体,差别的校验划定规矩呢?

改写注解,增加分组:

Class Foo{

    @Min(value = 18,groups = {Adult.class})
    private Integer age;

    public interface Adult{}

    public interface Minor{}
}

如许表明,只要在Adult分组下,18岁的限制才会起作用。

Controller层改写:

@RequestMapping("/drink")
public String drink(@Validated({Foo.Adult.class}) Foo foo, BindingResult bindingResult) {
    if(bindingResult.hasErrors()){
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            //...
        }
        return "fail";
    }
    return "success";
}

@RequestMapping("/live")
public String live(@Validated Foo foo, BindingResult bindingResult) {
    if(bindingResult.hasErrors()){
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            //...
        }
        return "fail";
    }
    return "success";
}

drink要领限制须要举行Adult校验,而live要领则不做限制。

基于要领校验

@RestController
@Validated <1>
public class BarController {

    @RequestMapping("/bar")
    public @NotBlank <2> String bar(@Min(18) Integer age <3>) {
        System.out.println("age : " + age);
        return "";
    }

    @ExceptionHandler(ConstraintViolationException.class)
    public Map handleConstraintViolationException(ConstraintViolationException cve){
        Set<ConstraintViolation<?>> cves = cve.getConstraintViolations();<4>
        for (ConstraintViolation<?> constraintViolation : cves) {
            System.out.println(constraintViolation.getMessage());
        }
        Map map = new HashMap();
        map.put("errorCode",500);
        return map;
    }

}

<1> 为类增加@Validated注解

<2> <3> 校验要领的返回值和入参

<4> 增加一个非常处理器,能够获得没有经由过程校验的属性相干信息

以上就是spring validation作为数据校验的要领引见(附代码)的细致内容,更多请关注ki4网别的相干文章!

分享到:

发表评论

评论列表

还没有评论,快来说点什么吧~

公众号二维码

微信公众号