温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用嵌套对象 @NotBlank @NotEmpty @NotBlank

发布时间:2021-10-12 16:31:47 来源:亿速云 阅读:354 作者:iii 栏目:大数据
# 如何使用嵌套对象 @NotBlank @NotEmpty @NotBlank

## 引言

在Java开发中,尤其是使用Spring框架进行Web开发时,参数校验是保证数据完整性和安全性的重要环节。`@NotBlank`、`@NotEmpty`和`@NotNull`是常用的校验注解,但当对象存在嵌套结构时,如何正确使用这些注解就变得复杂起来。本文将深入探讨如何在嵌套对象中有效使用这些注解。

---

## 一、基础注解回顾

### 1. `@NotNull`
- **作用**:验证字段是否为null
- **适用类型**:所有类型
- **示例**:
  ```java
  @NotNull
  private String username;

2. @NotEmpty

  • 作用:验证字段非null且非空(集合/数组/Map长度>0,字符串长度>0)
  • 适用类型:CharSequence、Collection、Map、Array
  • 示例
    
    @NotEmpty
    private List<String> tags;
    

3. @NotBlank

  • 作用:验证字符串非null且至少包含一个非空白字符
  • 适用类型:CharSequence
  • 示例
    
    @NotBlank
    private String password;
    

二、嵌套对象校验的挑战

当对象包含嵌套结构时,直接使用这些注解可能无法达到预期效果:

public class OrderDTO {
    @NotNull
    private UserDTO user;  // 需要同时校验user对象本身和其内部字段
}

public class UserDTO {
    @NotBlank
    private String name;
}

常见问题

  1. 外层对象通过校验但嵌套字段为null
  2. 集合内元素的校验失效
  3. 级联校验未生效

三、解决方案:级联校验

1. 使用@Valid注解

public class OrderDTO {
    @NotNull
    @Valid  // 关键注解:启用嵌套对象校验
    private UserDTO user;
}

2. 集合元素的校验

public class TeamDTO {
    @Valid
    private List<@Valid MemberDTO> members;  // 双重校验
}

public class MemberDTO {
    @NotBlank
    private String role;
}

四、特殊场景处理

1. 条件性校验

使用@AssertTrue实现自定义逻辑:

public class ProjectDTO {
    @Valid
    private Document doc;
    
    @AssertTrue
    public boolean isDocValid() {
        return doc == null || doc.getTitle() != null;
    }
}

2. 分组校验

public class UserDTO {
    @NotBlank(groups = BasicCheck.class)
    private String username;
    
    @NotBlank(groups = AdvancedCheck.class)
    private String password;
}

// 使用时指定组别
@Validated(AdvancedCheck.class)
public void createUser(@Valid UserDTO user) { ... }

五、最佳实践

  1. 组合使用注解

    @NotBlank
    @Size(max = 100)
    private String title;
    
  2. 明确校验边界

    • 在DTO层做基础格式校验
    • 在Service层做业务逻辑校验
  3. 统一异常处理

    @ControllerAdvice
    public class ValidationHandler {
       @ResponseStatus(HttpStatus.BAD_REQUEST)
       @ExceptionHandler(MethodArgumentNotValidException.class)
       public ErrorResponse handleValidationExceptions(...) {
           // 处理校验错误
       }
    }
    

六、常见问题排查

1. 校验不生效的可能原因

  • 忘记添加@Valid注解
  • 未启用校验(Spring Boot需spring-boot-starter-validation依赖)
  • 校验注解位置错误(应放在getter方法或字段上)

2. 性能优化建议

  • 对于复杂嵌套结构,考虑使用@Validated的分组功能
  • 避免过度嵌套(超过3层建议拆分为多个DTO)

结语

在嵌套对象中使用@NotBlank@NotEmpty等校验注解时,核心要点是: 1. 通过@Valid启用级联校验 2. 合理设计对象层级结构 3. 结合分组校验处理复杂场景

正确使用这些技术可以显著提高代码的健壮性,同时减少大量的样板校验代码。希望本文能帮助你在实际项目中更好地应用这些校验策略。

提示:Spring Boot 2.3+版本需要显式添加spring-boot-starter-validation依赖,这与早期版本不同。 “`

这篇文章共计约1100字,采用Markdown格式编写,包含代码示例、层级标题和重点强调,适合作为技术文档阅读。如需调整内容深度或示例复杂度,可以进一步修改。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI