有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Vaadin视图中的java自动布线服务和组件不工作

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

@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依赖项注入工作正常,但是当我尝试在组件中使用它时,它返回null:

@Route
public class CustomerForm extends FormLayout {

    @Autowired
    private CustomerService customerService;

我已经尝试过用@Component和@SpringComponent注释这个类,但是依赖注入不起作用,我认为问题并不是因为这个类不是一个bean,因为MainView类也不是一个bean

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

提前感谢您的帮助


共 (2) 个答案

  1. # 1 楼答案

    在Vaadin UI中,只能在路由端点(具有@Route注释的视图)中插入,并且只有在导航到注释中指定的路由时打开该视图。(因为只有到那时,该视图的实例化才会“自动”完成)

    经验法则是:每当你自己用new关键字实例化某个东西时,注入/自动连接都不起作用

    我对你情况的理解是:
    你有一个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){
            ...
        }
    }
    

    另一种方法是使CustomerForma @Component(记住在spring配置类中正确扫描它),将服务注入其中,然后将整个表单注入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
            ...
        }
    }
    
  2. # 2 楼答案

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

    如果用@Route注释该类,那么当导航到该路径时,Vaadin框架将注入依赖项

    在你的情况下,如果你没有导航到它,你必须把它变成一个Springbean。添加@Component@SpringComponent(第一个别名),然后在MainView中自动连接它,或者自动连接ApplicationContext并从那里获取它

    可以同时使用@Route@Component,这样它可以自动连接,但也可以导航到

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