Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Vaadin Spring Boot@autowired字段在视图中返回null_Spring Boot_Vaadin_Autowired_Vaadin Flow - Fatal编程技术网

Spring boot Vaadin Spring Boot@autowired字段在视图中返回null

Spring boot Vaadin Spring Boot@autowired字段在视图中返回null,spring-boot,vaadin,autowired,vaadin-flow,Spring Boot,Vaadin,Autowired,Vaadin Flow,首先,请原谅我的问题,因为我是新的春季开机生态系统。在我的应用程序中,我有一个vaadin页面,我想在其中使用存储库向DB提交用户详细信息。在我的视图类中,我将它们添加为@autowired字段,但是,在运行时,我看到它们的值正在运行,因此操作失败。我知道要从@autowired中获益,不应该在构建过程中新创建实例,但我不知道自己应该如何做。以下是我的课程: @SuppressWarnings("serial") public class LoginAwareComposit

首先,请原谅我的问题,因为我是新的春季开机生态系统。在我的应用程序中,我有一个vaadin页面,我想在其中使用存储库向DB提交用户详细信息。在我的视图类中,我将它们添加为@autowired字段,但是,在运行时,我看到它们的值正在运行,因此操作失败。我知道要从@autowired中获益,不应该在构建过程中新创建实例,但我不知道自己应该如何做。以下是我的课程:

@SuppressWarnings("serial")
public class LoginAwareComposite extends Composite<Div> {

@Autowired
private ApplicationEventPublisher publisher;

public LoginAwareComposite() {
}

@Override
protected void onAttach(AttachEvent event) {
    super.onAttach(event);
    UserCredentials userPrincipal = UI.getCurrent().getSession().getAttribute(UserCredentials.class);

    if (userPrincipal != null) {
        // --- NOT LOGGED IN
        UI.getCurrent().navigate(AddressBookManagementView.class);
    } 

}
}


因此,在BodyLayout的构造函数中,我们调用init函数,用于初始化布局并提供功能按钮等,init方法中的一个子函数使用myFunction提供提交按钮的功能。MyFunction使用存储库实体,但返回null。

因为您将springboot与vaadin一起使用,请确保:

确保@Repository注释用于您的存储库接口,如EmailRepository。 尝试对存储库类使用构造函数注入,如: 尝试以下方法:

@SuppressWarnings("serial")
@SpringComponent
@UIScope
public class BodyLayout extends VerticalLayout {

// some fields

private final EmailRepository emailRepository;

private final FaxRepository faxRepository;

@Autowired
public BodyLayout(EmailRepository emailRepository, FaxRepository faxRepository) {
    this.emailRepository = emailRepository;
    this.faxRepository = faxRepository;
    init(); //this function inits the view, and eventually inits the on click event for submit button , which then calls my function
}

private void myFunction() {
//here i use the repository entities but they do return null although they are autowired
}

由于您将springboot与vaadin一起使用,请确保:

确保@Repository注释用于您的存储库接口,如EmailRepository。 尝试对存储库类使用构造函数注入,如: 尝试以下方法:

@SuppressWarnings("serial")
@SpringComponent
@UIScope
public class BodyLayout extends VerticalLayout {

// some fields

private final EmailRepository emailRepository;

private final FaxRepository faxRepository;

@Autowired
public BodyLayout(EmailRepository emailRepository, FaxRepository faxRepository) {
    this.emailRepository = emailRepository;
    this.faxRepository = faxRepository;
    init(); //this function inits the view, and eventually inits the on click event for submit button , which then calls my function
}

private void myFunction() {
//here i use the repository entities but they do return null although they are autowired
}

我能够按如下方式使其工作:

@SuppressWarnings("serial")
@Route(value = "account")
@Theme(value = Lumo.class, variant = Lumo.LIGHT)
@UIScope
@SpringComponent
public class AddressBookManagementView extends LoginAwareComposite {

private VerticalLayout pageLayout = new VerticalLayout();

@Autowired
BodyLayout bodyLayout;

public AddressBookManagementView(BodyLayout bodyLayout) {
    this.bodyLayout = bodyLayout;
    getContent().setSizeFull();
    getContent().add(initPage());

}

private Component initPage() {
    pageLayout.getStyle().set("padding-left", "0px");
    pageLayout.getStyle().set("padding-bottom", "0px");
    pageLayout.getStyle().set("padding-right", "0px");
    pageLayout.getStyle().set("overflow", "auto");
    pageLayout.setSizeFull();

    pageLayout.add(new HeaderLayout(), bodyLayout, new FooterLayout());

    return pageLayout;
}
那么车身布局是

@SuppressWarnings("serial")
@UIScope
@SpringComponent
public class BodyLayout extends VerticalLayout {

private final EmailRepository emailRepository;

private final FaxRepository faxRepository;

@Autowired
public BodyLayout(EmailRepository emailRepository, FaxRepository faxRepository) {
    this.emailRepository = emailRepository;
    this.faxRepository = faxRepository;
    init();
}

我能够按如下方式使其工作:

@SuppressWarnings("serial")
@Route(value = "account")
@Theme(value = Lumo.class, variant = Lumo.LIGHT)
@UIScope
@SpringComponent
public class AddressBookManagementView extends LoginAwareComposite {

private VerticalLayout pageLayout = new VerticalLayout();

@Autowired
BodyLayout bodyLayout;

public AddressBookManagementView(BodyLayout bodyLayout) {
    this.bodyLayout = bodyLayout;
    getContent().setSizeFull();
    getContent().add(initPage());

}

private Component initPage() {
    pageLayout.getStyle().set("padding-left", "0px");
    pageLayout.getStyle().set("padding-bottom", "0px");
    pageLayout.getStyle().set("padding-right", "0px");
    pageLayout.getStyle().set("overflow", "auto");
    pageLayout.setSizeFull();

    pageLayout.add(new HeaderLayout(), bodyLayout, new FooterLayout());

    return pageLayout;
}
那么车身布局是

@SuppressWarnings("serial")
@UIScope
@SpringComponent
public class BodyLayout extends VerticalLayout {

private final EmailRepository emailRepository;

private final FaxRepository faxRepository;

@Autowired
public BodyLayout(EmailRepository emailRepository, FaxRepository faxRepository) {
    this.emailRepository = emailRepository;
    this.faxRepository = faxRepository;
    init();
}

大约只有@Route、layouts和vaadin init侦听器参与自动依赖项注入,即:vaadin-spring集成要求spring上下文构建它们。如果你使用新的MyClass,它就不会参与DI。在@Autowired中使用基于字段的注入隐藏了这个问题-因此使用基于构造函数的注入是行业标准。另一种方法是,如果你想参与DI,不要构建你自己的实例,而是让spring上下文为你构建一个实例。

大致上只有@Route、layouts和vaadin init侦听器参与自动依赖注入,也就是说:vaadin spring集成要求spring上下文构建它们。如果你使用新的MyClass,它就不会参与DI。在@Autowired中使用基于字段的注入隐藏了这个问题-因此使用基于构造函数的注入是行业标准。另一种方法是,如果你想参与DI,不要构建你自己的实例,而是请spring上下文为你构建一个实例。

非常感谢你的帮助,但我仍然无法摆脱空问题,如果我使用你提供的模式,我需要bodylayout的构造函数信息,这意味着在addressbook managementview中,我需要再次提供这些存储库字段的实例,我还将uiscope和spring组件添加到addressbook view中,并在那里为回购创建自动连接字段,以便iObject bodylayouts Constructor,它仍然为我提供null:/2个重要的内容:1。如果在字段上使用field injection@Autowired,则构造函数中不会提供该字段,只能在以后使用。2.无论您使用字段注入还是构造函数注入,如果您自己创建实例,它都不会起作用。你需要让Spring为你创建它。嘿,Erik非常感谢你,所以muhc,但是为了在页面中嵌入视图,我需要一个BodyLayout的新实例,那么我如何在不创建新关键字的情况下实例化它呢?@AhmetEroğlu Erik使用新关键字是正确的,它不允许你使用Spring bean injection。请在您使用BodyLayout类的地方共享该代码。您好@Ananthapadmanabhan问题中已经共享了该代码,AddressBookManagementView是该代码使用的视图感谢您的帮助,但我仍然无法摆脱空值问题,如果我使用您提供的模式,我需要BodyLayout的构造函数信息,这意味着在addressbook managementview中,我需要再次提供这些存储库字段的实例,我还将uiscope和spring组件添加到addressbook view中,并在那里为回购创建自动连接字段,以便iObject bodylayouts Constructor,它仍然为我提供null:/2个重要的内容:1。如果在字段上使用field injection@Autowired,则构造函数中不会提供该字段,只能在以后使用。2.无论您使用字段注入还是构造函数注入,如果您自己创建实例,它都不会起作用。你需要让Spring为你创建它。嘿,Erik非常感谢你,所以muhc,但是为了在页面中嵌入视图,我需要一个BodyLayout的新实例,那么我如何在不创建新关键字的情况下实例化它呢?@AhmetEroğlu Erik使用新关键字是正确的,它不允许你使用Spring bean injection。请在您使用BodyLayout类的地方共享该代码。您好@Ananthapadmanabhan问题中已经共享了该代码,AddressBookManagementView是使用该代码的视图。有可能会问一个显而易见的问题:您确定BodyLayout中没有任何地方可以执行类似emailRepository=new E的操作
mailRepository;。是吗?冒着问显而易见的问题的风险:你肯定BodyLayout中没有你做过像emailRepository=new emailRepository;这样的事情;。正当