0

我已经使用 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> 

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

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

  @PostConstruct
  public void init() {
    System.out.println("test");
  }
}

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

4

2 回答 2

2

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

于 2020-11-27T02:23:20.737 回答
0

使用您提供的代码并创建一个虚拟UserService类,HTTP 请求在其他环境中可以正常工作。

为了帮助解决您遇到的问题,您应该创建一个新项目,添加lombokstarter-webstarter-validation依赖项。创建以下类。

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

    @PostConstruct
    public void init() {
        System.out.println("test");
    }

    @GetMapping("/test")
    public int test(){
        return userService.getAge();
    }
}

@Data
@Service
public class UserService {
    private int age = 21;
}

然后测试http://localhost:8080/test

如果这对您不起作用,那么您应该尝试使缓存无效并重新启动 IDE。如果您单击 ,Intellij 有一个选项File > Invalidate Caches / Restart ...。或者,您可以从 .m2 文件夹中删除工件(或完整的本地存储库)。C:\Users\<username>\.m2\repository并用 Maven 重建。

如果这仍然不能解决您的问题,请使用更完整的可重现问题示例以及错误的完整控制台日志来更新您的问题,我将更新我的答案。

于 2020-11-21T23:14:10.010 回答