Vaadin 视图中的自动装配服务和组件不工作

Autowiring services in Vaadin view and components not working

各位程序员大家好!我对 Vaadin 比较陌生,所以请饶了我吧。 我正在尝试将我的服务层自动连接到我的视图中,如下所示:

@Route("")
@PWA(name = "First time bruh", shortName = "Project Base")
public class MainView extends VerticalLayout {

    private TextField filterText = new TextField();
    private Grid<Customer> grid = new Grid<>(Customer.class);
    private CustomerForm customerForm = new CustomerForm(this);

    @Autowired
    private CustomerService customerService;

并且 customerService 依赖项注入工作正常,但是当我尝试在组件中使用它时 returns null:

@Route
public class CustomerForm extends FormLayout {

    @Autowired
    private CustomerService customerService;

我试过用@Component 和@SpringComponent 注释 class 但依赖注入不起作用,我认为问题不在于 class 不是一个 bean,因为 MainView Class 也不是一个 bean。

我希望我创建的自定义子组件能够访问服务层。

在此先感谢您的帮助!

当您使用 new 关键字自己创建实例时,注入不起作用。

如果 class 被注释为 @Route,则在导航到该路由时,Vaadin 框架将注入依赖项。

在您的情况下,如果您不导航到它,则必须将其设为 Spring bean。添加 @Component@SpringComponent(第一个的别名),然后在您的 MainView 中自动装配它,或者自动装配 ApplicationContext 并从那里获取它。

同时拥有 @Route@Component 很好,这样既可以自动装配,又可以导航到。

如果添加 @Component 注释,请记住选择适当的范围,@UIScope 在导航时重复使用相同的实例,或者 Scope.PROTOTYPE 始终创建一个新实例。

在 Vaadin UI 中,您只能在路由端点(具有 @Route 注释的视图)中注入,并且仅当通过导航到注释中指定的路由打开该视图时。 (因为只有那时该视图的实例化才完成 "automatically")。

根据经验:每当您使用 new 关键字自己实例化某些内容时,injection/autowiring 将不起作用。

我了解你的情况是:
您有一个 MainView,您想在其中添加一个 CustomerForm

实现方法如下:
CustomerService 注入 MainView,并将 CustomerService 实例传递给 CustomerForm

的构造函数
@Route
public class MainView extends VerticalLayout {
    public MainView(CustomerService customerService) { // customerService will be injected
        CustomerForm customerForm = new CustomerForm(customerService);
        add(customerForm);
    }
}

public class CustomerForm extends FormLayout {
    public CustomerForm (CustomerService customerService){
        ...
    }
}

另一种方法是使 CustomerForm 成为 @Component(请记住在 spring 配置 class 中正确扫描它),将服务注入其中, 然后将整个表单注入 MainView:

@Route
public class MainView extends VerticalLayout {
    public MainView(CustomerForm customerForm) {  // customerForm will be injected
        add(customerForm);
    }
}

@Component
public class CustomerForm extends FormLayout {
    public CustomerForm (CustomerService customerService){ // customerService will be injected
        ...
    }
}