Vaadin View中Spring Bean注入失败问题求助
问题原因及解决方案
你遇到的不是Vaadin Flow的bug,而是依赖注入的时机问题:
不管是Spring的@Autowired还是CDI的@Inject,字段注入都是在对象构造完成之后才执行的。你在视图的构造函数里直接访问userService,这时候注入还没完成,自然是null。而构造器注入是Spring/CDI在创建对象时直接把依赖传进去,所以能正常使用。
解决方法
方法1:改用@PostConstruct初始化逻辑
如果坚持用字段注入,把需要依赖的初始化代码放到标注了@PostConstruct的方法里,这个方法会在依赖注入完成后自动执行:
@PageTitle("About") @Route(value = "about", layout = MainLayout.class) public class AboutView extends VerticalLayout { @Autowired private UserService userService; public AboutView() { // 这里只做不需要依赖的初始化,比如创建基础UI组件 } @PostConstruct private void initView() { // 在这里安全使用userService String userName = userService.getCurrentUserName(); add(new Label("当前用户:" + userName)); } }
方法2:适配CDI环境(Payara Micro场景)
- 确保
UserService是合法的CDI Bean,比如添加@ApplicationScoped或@RequestScoped注解。 - 不要用
@EJB,除非UserService是EJB组件,普通CDI Bean用@Inject即可。 - 同样避免在构造函数里访问注入字段,改用
@PostConstruct方法执行依赖相关逻辑。
补充说明
你的REST服务能用@AllArgsConstructor正常注入,是因为Lombok的@AllArgsConstructor帮你生成了构造器,本质还是构造器注入——Spring会自动把依赖通过构造函数传进去,不存在注入时机的问题。
内容的提问来源于stack exchange,提问作者Sogawa-sps
相关产品推荐
相关产品推荐

