@Validate 注解的使用-分组案例很有用

@Validated 注解在 Spring Boot 中用于方法参数校验,通常与 @Valid 注解结合使用,确保传入的参数符合指定的约束条件。它是 Spring 对 JSR-303/JSR-380(Bean Validation)规范的扩展,支持分组校验。

1. 基本使用

1.1 添加依赖

首先,确保项目中包含 spring-boot-starter-validation 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
1.2 定义实体类

在实体类中使用校验注解,如 @NotNull@Size 等:

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class User {

    @NotNull(message = "Name cannot be null")
    private String name;

    @Size(min = 1, max = 10, message = "Description must be between 1 and 10 characters")
    private String description;

    // Getters and Setters
}
1.3 在 Controller 中使用 @Validated

在 Controller 方法参数前使用 @Validated@Valid 注解触发校验:

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController
@RequestMapping("/users")
@Validated
public class UserController {

    @PostMapping
    public String createUser(@Valid @RequestBody User user) {
        return "User is valid";
    }
}

2. 分组校验

@Validated 支持分组校验,适用于不同场景下的不同校验规则。

2.1 定义分组接口

创建分组接口:

public interface GroupA {}
public interface GroupB {}
2.2 在实体类中指定分组

在实体类中为校验注解指定分组:

public class User {

    @NotNull(groups = GroupA.class, message = "Name cannot be null")
    private String name;

    @Size(groups = GroupB.class, min = 1, max = 10, message = "Description must be between 1 and 10 characters")
    private String description;

    // Getters and Setters
}
2.3 在 Controller 中使用分组校验

在 Controller 方法中使用 @Validated 指定分组:

@RestController
@RequestMapping("/users")
@Validated
public class UserController {

    @PostMapping("/groupA")
    public String createUserGroupA(@Validated(GroupA.class) @RequestBody User user) {
        return "User is valid for GroupA";
    }

    @PostMapping("/groupB")
    public String createUserGroupB(@Validated(GroupB.class) @RequestBody User user) {
        return "User is valid for GroupB";
    }
}

3. 方法级别校验

@Validated 还可用于方法级别的参数校验。

3.1 在 Service 层使用

在 Service 层方法参数前使用 @Validated

import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;

@Service
@Validated
public class UserService {

    public void createUser(@Valid User user) {
        // 业务逻辑
    }
}

4. 异常处理

校验失败时,Spring 会抛出 MethodArgumentNotValidExceptionConstraintViolationException,可以通过 @ControllerAdvice@ExceptionHandler 捕获并处理。

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        return errors;
    }
}

总结

@Validated 在 Spring Boot 中用于参数校验,支持分组校验和方法级别校验,结合 @Valid 使用,能有效确保数据合法性,并通过异常处理机制返回友好错误信息。

<think>嗯,用户想了解Java@Validated注解分组校验用法,还有示例。我之前记得分组校验是通过定义接口来区分不同的校验场景,比如创建和更新操作可能需要不同的校验规则。首先需要确认@Validated和@Valid的区别,@Validated支持分组而@Valid不支持。然后用户可能需要知道如何定义分组接口,如何在实体类的注解中指定groups属性,以及在Controller方法中使用@Validated并指定分组。 还要注意,在Spring中,@Validated是用在类级别上的,而方法参数上可能需要配合@Valid或其他注解使用。例如,在Controller的方法参数前使用@Validated(Group.class)来指定校验组。同时,需要确保校验器已经正确配置,比如使用Hibernate Validator。 示例部分的话,可以定义一个CreateGroup和UpdateGroup接口作为分组标识,然后在实体类的字段上使用@NotNull等注解,并指定groups属性。在Controller的方法中,使用@Validated(分组类.class)来触发对应的校验。这样不同的接口方法可以根据需求应用不同的校验规则。 另外,用户可能还关心如何处理分组校验的错误信息,比如使用BindingResult来捕获错误,或者统一异常处理。还需要提到如果公共字段需要多个分组校验,可以不在注解中指定groups,这样它们会被所有分组校验。而特定分组的校验则只在指定分组时生效。 可能还需要对比一下分组校验和普通校验的区别,以及为什么需要分组校验。比如在复杂的业务场景中,同一个实体在不同操作下需要不同的校验规则,这时候分组就非常有用。同时,可以提到自定义校验和条件校验,但用户的问题主要是分组,所以可能不需要深入。 最后,确保示例代码正确,比如实体类中的注解使用groups,Controller方法使用@Validated指定分组,并展示一个POST请求的例子。可能还需要提醒用户注意引入正确的依赖,比如Hibernate Validator和相关Spring模块。</think>### Java @Validated分组校验使用方法详解 分组校验允许开发者为同一实体对象在不同场景定义差异化校验规则,以下是具体实现步骤: --- #### 一、定义分组标识接口 ```java // 创建操作校验组 public interface CreateGroup {} // 更新操作校验组 public interface UpdateGroup {} ``` --- #### 二、实体类应用分组校验 ```java public class User { // ID在更新时必须校验 @NotNull(groups = UpdateGroup.class, message = "ID不能为空") private Long id; // 用户名在创建和更新时都要校验 @NotBlank(message = "用户名不能为空") @Size(min = 3, max = 20, message = "用户名长度3-20字符") private String username; // 密码仅在创建时校验 @NotBlank(groups = CreateGroup.class, message = "密码不能为空") @Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$", message = "密码必须包含字母和数字", groups = CreateGroup.class) private String password; // Getters/Setters省略 } ``` --- #### 三、Controller层应用分组 ```java @RestController @Validated // 必须激活校验 public class UserController { // 创建接口使用CreateGroup分组 @PostMapping("/users") public ResponseEntity<?> createUser(@RequestBody @Validated(CreateGroup.class) User user) { return ResponseEntity.ok("创建成功"); } // 更新接口使用UpdateGroup分组 @PutMapping("/users/{id}") public ResponseEntity<?> updateUser(@PathVariable Long id, @RequestBody @Validated(UpdateGroup.class) User user) { return ResponseEntity.ok("更新成功"); } } ``` --- #### 四、分组校验特性说明 1. **继承特性** 分组接口支持继承,子接口自动包含父接口的校验规则: ```java public interface AdminGroup extends UpdateGroup {} ``` 2. **多组叠加** 可同时指定多个校验组: ```java @Validated({CreateGroup.class, AdminGroup.class}) ``` 3. **默认校验规则** 未指定`groups`的注解会在所有分组中生效[^2] --- #### 五、错误处理示例 ```java @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<?> handleValidationException(MethodArgumentNotValidException ex) { Map<String, String> errors = ex.getBindingResult() .getFieldErrors() .stream() .collect(Collectors.toMap( FieldError::getField, FieldError::getDefaultMessage )); return ResponseEntity.badRequest().body(errors); } ``` --- ### 分组校验应用场景 1. 同一实体在不同业务场景下的差异化校验(如创建/更新) 2. 管理员与普通用户操作的不同校验强度 3. 多步骤表单的分阶段校验 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知识浅谈

您的支持将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值