为什么@Validated注解controller层有效,在service层无效?

@Validated注解在service层无效,dto字段上加了@NotBlank等注解,在controller层是可以的

实现类

@Service
@Validated
public class ServiceImpl implements Service, Handler
  public Long addInfo(@Valid  Dto dto){
// ValidationUtils.validateEntity(dto, AddGroup.class);暂时在方法里写了校验
    return null;
  }
}

接口

@Validated
public interface Service {
Long addInfo(@Valid Dto dto);
}
@Configuration
public class ValidationConfig {
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }
}
阅读 797
1 个回答
  1. 引入 spring-boot-starter-validation 依赖(Spring Boot 2.x 默认支持 javax.validation):

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
  2. 在 Service 层正确使用 @Validated

    import javax.validation.Valid;
    import org.springframework.stereotype.Service;
    import org.springframework.validation.annotation.Validated;
    
    @Service
    @Validated // 这里启用方法级别验证
    public class UserService {
        public Long addUser(@Valid UserDto userDto) {
            // 业务逻辑
        }
    }
  3. DTO使用 javax.validation.constraints 提供的注解

    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    
    public class UserDto {
        @NotNull(message = "用户名不能为空")
        @Size(min = 3, max = 20, message = "用户名长度必须在3-20之间")
        private String username;
    }
  4. 注册 MethodValidationPostProcessor 以支持 @Validated

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
    
    @Configuration
    public class ValidationConfig {
        @Bean
        public MethodValidationPostProcessor methodValidationPostProcessor() {
            return new MethodValidationPostProcessor();
        }
    }

补充

  • @Validated 是 Spring 的注解,可用于类或方法参数,支持分组验证
  • @Valid 是 JSR-303 规范的注解,主要用于对象属性级联验证
  • 两者结合使用时,通常在控制器类上标注 @Validated,在需要验证的方法参数上使用 @Valid

需要同时引入 spring-boot-starter-validation 依赖来确定这些验证功能正常

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题