栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot项目使用validation-api进行参数校验

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot项目使用validation-api进行参数校验

一、引入依赖

要使用参数校验注解,需要引入以下依赖,注意springboot2.0的web模块已经包含此依赖

        
            jakarta.validation
            jakarta.validation-api
        

添加了这个jar包,仅代表可以在项目中引入如@NotNull等注解,但是它并不会起作用,上面的依赖只是使用了Java规范,并没有提供实现,因此还需要引入hibernate-validator模块

		
            org.hibernate
            hibernate-validator
            6.1.0.Final
        

在springboot项目中直接使用场景启动器即可

		
            org.springframework.boot
            spring-boot-starter-validation
        
二、参数校验 1- 在Controller中使用

由于springweb对http接口的参数校验进行了封装,在requestbody中使用参数校验如果校验未通过,则抛出的异常为spring定义的异常org.springframework.web.bind.MethodArgumentNotValidException。使用 @Valid 和 @Validated都可,区别在于前者由hibernate-validator提供,后者由spring提供。如果是对象参数则抛出org.springframework.validation.BindException。

@RestController
@RequestMapping("/validator")
public class ValidatorController {

    @PostMapping("test1")
    public String test1(@Valid @RequestBody TestDto testDto) {
        System.out.println(testDto);
        return "success";
    }

    @Data
    private static class TestDto {
        @NotNull(message = "id不能为空")
        private Long id;
        @NotBlank(message = "name不能为空")
        private String name;
    }
}
2 - 在其它bean中使用 单参数校验

在controller中使用参数校验可以保证接口请求时数据的完整性,在其它的参数校验情况下,例如service中需要校验某方法参数,bean一定要加入 @Validated注解,使用方式如下:

@Service
@Validated
public class ValidatorService {

    public void test1(@NotNull String name) {
        System.out.println(name);
    }

}

在调用此test1方法时,如果实参为null,则抛出 javax.validation.ConstraintViolationException异常。

还可以对方法的返回值进行校验

    @NotNull(message = "test3的返回值不能为空") public String test3() {
        return null;
    }

调用以上方法一定会抛出异常

对象的属性校验

如果方法的参数为对象,则需要对形参加入@Valid 或者 @Validated注解才能起作用

@Service
@Validated
public class ValidatorService {

    public void test2(@Valid SaveDTO saveDTO) {
        System.out.println(saveDTO);
    }
    
    @Data
    public static final class SaveDTO {
        @NotNull(message = "id不能为空")
        private Long id;
        
        @NotEmpty(message = "username不能为空")
        private String username;
    }

}

如果对象的属性也是对象,要对这个属性进行校验则需要加 @Valid 注解

    @Data
    public static final class SaveDTO {
       
        @NotNull(message = "id不能为空")
        private Long id;
        @NotEmpty(message = "username不能为空")
        private String username;
        @Valid
        private InnerClass innerClass;
    }
    
    @Data
    private static final class InnerClass {
        @NotNull(message = "id不能为空")
        private String id;
    }
三、分组校验

在对象参数校验场景下,有一种特殊场景,同一个参数对象在不同的场景下有不同的校验规则。比如,在创建对象时不需要传入id字段(id字段是主键,由系统生成,不由用户指定),但是在修改对象时就必须要传入id字段。在这样的场景下就需要对注解进行分组。此时只能使用 @Validated

组件有一个默认的分组 Default.class,我们可以再创建一个分组

public @interface UpdateAction {

}

在参数类中需要校验的属性上,在注解中添加groups属性:

package com.example.demo.service;

import com.example.demo.config.UpdateAction;
import lombok.Data;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.groups.Default;


@Service
@Validated
public class ValidatorService {

    
    public void update(@Validated({Default.class, UpdateAction.class}) SaveDTO saveDTO) {
        System.out.println(saveDTO);
    }

    
    public void save(@Validated({Default.class}) SaveDTO saveDTO) {
        System.out.println(saveDTO);
    }

    @Data
    public static final class SaveDTO {
        
        @NotNull(message = "id不能为空", groups = {UpdateAction.class})
        private Long id;
        
        @NotEmpty(message = "username不能为空")
        private String username;
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/731627.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号