Spring引导验证CGLIB增强控制器组件未自动装配

mas*_*lan 0 hibernate-validator cglib nhibernate-validator spring-boot

我已经使用 Rest 控制器创建了一个 Spring Boot 应用程序(用户 spring-boot-starter-parent V.2.2.2.RELEASE),工作正常,现在我添加了一个依赖项:

    <dependency> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-validation</artifactId> 
    </dependency> 
Run Code Online (Sandbox Code Playgroud)

并在我的控制器类上添加了@Validated,以便验证其中的所有方法:

@RestController
@Validated 
public class UserController {
  @Autowired
  private UserService userService;

  @PostConstruct
  public void init() {
    System.out.println("test");
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,控制器方法在调用时开始抛出 NullPointerExceptions,因为 userService 为 null;我做了一个@PostConstruct 作为测试。显然,它是在一个正常的未增强的 bean 上调用的,该 bean 的字段已正确自动连接。但是,当通过 HTTP 调用控制器时,不会调用这个未增强的 bean,但它是类 UserController$$EnhancerBySpringCGLIB$$ 的 bean,并且它的 userController 未自动装配。我真的不知道为什么,因为这应该很简单,据我所知,没有太多需要配置的。所以我猜由于某种原因,spring 不会将依赖项注入到 CGLIB 增强类中,或者只是将其注入到错误的类中。当我删除@Validated时,一切都再次正常工作,但当然没有验证。

mas*_*lan 6

这是我多年来犯过的最可笑的错误。我错误地将原始项目中的控制器方法设置为私有。这导致 CGLIB 没有增强它们,而只是将它们与原始代码一起使用。Spring 没有抱怨并且很高兴运行这些方法