SpringBoot整合校验框架validation

本文详细介绍了在Spring Boot项目中如何整合Hibernate Validation进行数据校验,包括使用原生注解、自定义校验规则以及统一异常处理。内容涵盖了@Validated注解的使用、自定义校验注解@FlagValidator和@PhoneValidator的实现,以及常见校验注解的解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文介绍在Spring Boot中实现对请求的数据进行校验。数据校验常用到概念:
• JSR303/JSR-349: JSR303是一项标准,只提供规范不提供实现,规定一些校验规范即校验注解,如@Null,@NotNull,@Pattern,位于javax.validation.constraints包下。JSR-349是其的升级版本,添加了一些新特性。
• hibernate validation:hibernate validation是对这个规范的实现,并增加了一些其他校验注解,如@Email,@Length,@Range等等
• spring validation:spring validation对hibernate validation进行了二次封装,在springmvc模块中添加了自动校验,并将校验信息封装进了特定的类中
本文主要包括如下内容:
• 演示 spring boot validation 校验功能 + 自定义校验注解 + 统一异常处理 。

一:准备工作

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

项目架子:
在这里插入图片描述
在这里插入图片描述

二:校验规则

2.1 使用原生注解-swagger注解可以忽略

entity中实体代码

其中 @FlagValidator(values = “1,2,3”) 和 @PhoneValidator 是自定义校验注解,自定义过程后面说。
其余注解都是自带的,关于自带注解有哪些,见文末的常用标签含义。

@Data
public class UserEntity implements Serializable {
   
    @NotEmpty(message = "姓名不能为空")
    private String name;
    @Min(value = 18 ,message = "未满18周岁请自觉离开。。。")
    @Max(value = 60,message = "您老身体可还吃得消?大于60岁自觉离开。")
    private int age;
    @Min(value = 666,message = "钱包够憋,不够¥666请自觉充值。")
    private double money;
    @FlagValidator(values = "1,2,3")
    private String flag;
    @Email(message = "请输入正确格式的邮箱。。")
    @NotEmpty(message = "邮箱不能为空哦!")
    private String email;
    @PhoneValidator
    private String phone;
}

校验对象:在Controller 中请求参数上添加@Validated ,在对应的实体字段上加校验注解即可。

@Api("UserController层")
@RequestMapping(value = "/UserController")
@RestController
public class UserController {
   
    @ApiOperation(value = "向user表插入数据")
    @PostMapping(value = {
   "/insetUser/"})
    public ResultMsg<UserEntity> insertUser(@Validated @RequestBody UserEntity userEntity) {
   
        return new ResultMsg<UserEntity>("0000", "success", userEntity
<think>好的,我现在需要回答用户关于Oracle数据库中LEN函数的问题。首先,我得确认用户提到的LEN函数是否存在,因为在Oracle中,通常使用的是LENGTH函数而不是LEN。可能用户是从其他数据库系统(比如SQL Server)转过来的,因为SQL Server确实有LEN函数。 接下来,我需要回忆Oracle的字符串函数,确认LENGTH的用法。LENGTH函数返回字符串的字符数,包括空格,但要注意它会计算尾部的空格吗?比如,如果字符串是'abc ',用LENGTH的结果是4还是3?根据Oracle文档,LENGTH会计算所有字符,包括尾部空格,而如果使用VSIZE函数可能会不同,但用户可能不需要这么深入。 然后,用户可能想知道如何获取字符串长度,所以需要提供示例。比如SELECT LENGTH('Hello') FROM dual; 结果应该是5。同时,可能需要对比其他数据库的函数,说明Oracle使用LENGTH而不是LEN,避免混淆。 另外,用户可能还会遇到处理多字节字符的情况,比如UTF-8中的字符,这时候LENGTH返回的是字符数,而不是字节数。如果需要字节数,应该使用LENGTHB函数。这也需要提到,以覆盖用户可能的其他需求。 还有,需要注意当字段为NULL时,LENGTH会返回NULL,所以用户可能需要使用NVL来处理这种情况。例如,SELECT LENGTH(NVL(column_name, '')) FROM table; 这样可以避免NULL的结果。 最后,总结一下,确保回答结构清晰,分点说明,给出示例,并指出与其他数据库的区别,以及处理特殊情况的方法。这样用户就能全面了解如何在Oracle中获取字符串长度,并避免常见的误区。</think>在 Oracle 数据库中,**没有内置的 `LEN` 函数**。你可能混淆了其他数据库(如 SQL Server)的函数名称。Oracle 中用于获取字符串长度的函数是 **`LENGTH`**。 --- ### 逐步说明: 1. **函数名称差异** - SQL Server 使用 `LEN()` 计算字符串长度,但 **Oracle 使用 `LENGTH()`**。 - 示例: ```sql SELECT LENGTH('Hello Oracle') FROM dual; ``` 输出结果:`12`(包括中间的空格)。 2. **功能细节** - `LENGTH()` 返回字符串的 **字符数量**(包括空格和特殊字符)。 - 如果字段值为 `NULL`,`LENGTH()` 返回 `NULL`。 - 示例: ```sql SELECT LENGTH('你好') FROM dual; -- 输出 2(每个汉字计为1个字符) SELECT LENGTH(NULL) FROM dual; -- 输出 NULL ``` 3. **扩展场景** - **处理多字节字符**: 若需计算字节数(如 UTF-8 编码),使用 `LENGTHB()`: ```sql SELECT LENGTHB('你好') FROM dual; -- 输出 6(每个汉字占3字节) ``` - **排除尾部空格**: Oracle 的 `LENGTH()` 默认包含尾部空格。若需忽略,可先用 `RTRIM()` 处理: ```sql SELECT LENGTH(RTRIM('abc ')) FROM dual; -- 输出 3 ``` 4. **与其他数据库对比** | 数据库 | 函数名 | 行为差异 | |------------|---------|------------------------| | Oracle | LENGTH | 包含所有字符,包括空格 | | SQL Server | LEN | 自动忽略尾部空格 | | MySQL | CHAR_LENGTH | 类似 Oracle 的 LENGTH | --- ### 总结 - **Oracle 使用 `LENGTH()`** 而非 `LEN`。 - 注意字符与字节的区别(`LENGTH` vs `LENGTHB`)。 - 处理 `NULL` 值时需结合 `NVL()` 等函数,例如: ```sql SELECT LENGTH(NVL(column_name, '')) FROM table; ``` 如有其他具体场景,可进一步讨论优化方案!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值