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

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

## 引言

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

---

## 一、基础注解回顾

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

2. @NotEmpty

3. @NotBlank


二、嵌套对象校验的挑战

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

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. 校验不生效的可能原因

2. 性能优化建议


结语

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

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

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

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

推荐阅读:
  1. Hibernate validator使用以及自定义校验器注解
  2. Springboot如何使用@Valid 和AOP做参数校验及日志输出问题

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

java

上一篇:HTML 5 Canvas应用有哪些

下一篇:HTML 5特效页面及js测试页面汇总的示例分析

相关阅读

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

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