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