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
...
}
}
各位程序员大家好!我对 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
...
}
}