@Validated注解在Spring Boot项目中为何在service层无效,而在controller层有效?

spring boot项目中,@validated注解在不同层级的使用可能存在差异。让我们通过一个具体的案例来探讨为什么@validated注解在controller层有效,而在service层无效,以及如何解决这个问题。

spring boot项目中@Validated注解在不同层级的使用问题

在Spring Boot项目开发中,我们经常使用@Validated注解来进行参数校验。然而,有时会发现这个注解在controller层有效,但在service层却无法正常工作。让我们深入探讨这个问题并找到解决方案。

问题描述

当我们在service层使用@Validated注解,并在DTO类的字段上添加了@NotBlank等注解时,校验在controller层可以正常工作,但在service层却无法生效。

示例代码如下:

@Service public class ServiceImpl implements Service {     public Long addInfo(@Validated(AddGroup.class) Dto dto) {         // ...     } }

问题解析及解决方案

在Spring Boot 3及以上版本中,默认情况下,@Validated注解在service层不会自动生效。要使其在service层也生效,需要在启动类中添加@EnableMethodValidation注解。

具体操作如下:

@SpringBootApplication @EnableMethodValidation public class Application {     public static void main(String[] args) {         SpringApplication.run(Application.class, args);     } }

此外,为了确保服务层的方法能够正确使用@Validated注解进行参数校验,还需要在服务类上添加@Validated注解:

import jakarta.validation.constraints.NotBlank; import jakarta.validation.groups.Default; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated;  // 定义校验组 public interface AddGroup {}  // 定义 DTO 类 public class Dto {      @NotBlank(groups = {AddGroup.class, Default.class}) // 多个验证组     private String name;      // Getter 和 Setter     public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     } }  // Service 层 @Service @Validated // 确保类支持参数校验 public class ServiceImpl {      public Long addInfo(@Validated(AddGroup.class) Dto dto) {         // 校验通过后执行业务逻辑         System.out.println("Name: " + dto.getName());         return 1L;     } }  // Controller 层(测试 Service 调用) @RestController @RequestMapping("/test") public class TestController {      private final ServiceImpl service;      public TestController(ServiceImpl service) {         this.service = service;     }      @PostMapping("/add")     public String addInfo(@RequestBody Dto dto) {         service.addInfo(dto);         return "Success";     } }

通过以上配置和代码示例,可以确保@Validated注解在service层也能正常工作,从而实现参数校验功能。

@Validated注解在Spring Boot项目中为何在service层无效,而在controller层有效?

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享