Jakarta ee 如何在Vaadin中获取CDIView中的UI实例?

Jakarta ee 如何在Vaadin中获取CDIView中的UI实例?,jakarta-ee,cdi,vaadin8,Jakarta Ee,Cdi,Vaadin8,我有MyUI课程 @Theme("mytheme") @CDIUI("") public class MyUI extends UI { @Inject LoginView loginView; @Override protected void init(VaadinRequest vaadinRequest) { setContent(loginView); } ... 我有一个用@PostConstruct @UIScoped @CDIView(LoginView.VIEWN

我有MyUI课程

@Theme("mytheme")
@CDIUI("")
public class MyUI extends UI {

@Inject
LoginView loginView;

@Override
protected void init(VaadinRequest vaadinRequest) {
    setContent(loginView);
}

...
我有一个用
@PostConstruct

@UIScoped
@CDIView(LoginView.VIEWNAME)
public class LoginView extends VerticalLayout implements CustomView {

    @PostConstruct
    public void initView() {

        //initializations elements 
        Component loginForm = buildLoginForm();
        addComponent(loginForm);
        setComponentAlignment(loginForm, Alignment.MIDDLE_CENTER);

        Notification notification = new Notification("Demo");
        notification.setDescription("<span>DEMO</span>");
        notification.setHtmlContentAllowed(true);
        notification.setStyleName("tray dark small closable login-help");
        notification.setPosition(Position.BOTTOM_CENTER);
        notification.setDelayMsec(20000);
        notification.show(Page.getCurrent()); // NullPointerException

    }
}
我的问题是如何在呈现视图元素的过程中使用UI实例

我发现了一个部分解决方案,它将所有元素的定义放入一个configure方法中,方法如下:

public void configure() {
    //initializations elements
    Component loginForm = buildLoginForm();
    addComponent(loginForm);
    setComponentAlignment(loginForm, Alignment.MIDDLE_CENTER);

    Notification notification = new Notification("Demo");
    notification.setDescription("<span>DEMO</span>");
    notification.setHtmlContentAllowed(true);
    notification.setStyleName("tray dark small closable login-help");
    notification.setPosition(Position.BOTTOM_CENTER);
    notification.setDelayMsec(20000);
    notification.show(Page.getCurrent());
}

最后,在同事的帮助下,我找到了一个解决方案:

有必要以这种方式使用CDIViewProvider

@Theme("mytheme")
@CDIUI("")
public class MyUI extends UI {

@Inject
LoginView loginView;

@Inject
private CDIViewProvider viewProvider;

@Override
protected void init(VaadinRequest vaadinRequest) {
    Navigator navigator = new Navigator(this, this);
    navigator.addProvider(viewProvider);
    navigator.navigateTo("login");
}
在类中,定义视图的名称,并将视图元素的所有定义放入entering方法中

@UIScoped
@CDIView(LoginView.VIEWNAME)
public class LoginView extends VerticalLayout implements CustomView {

    public static final String VIEWNAME = "login";

   //...
   //other methods
   //... 

   @Override
   public void enter(ViewChangeListener.ViewChangeEvent event) {
      //initializations elements
      Component loginForm = buildLoginForm();
      addComponent(loginForm);
      setComponentAlignment(loginForm, Alignment.MIDDLE_CENTER);

      Notification notification = new Notification("Demo");
      notification.setDescription("<span>DEMO</span>");
      notification.setHtmlContentAllowed(true);
      notification.setStyleName("tray dark small closable login-help");
      notification.setPosition(Position.BOTTOM_CENTER);
      notification.setDelayMsec(20000);
      notification.show(Page.getCurrent());
    }
}
@UIScoped
@CDIView(LoginView.VIEWNAME)
公共类LoginView扩展了VerticalLayout,实现了CustomView{
公共静态最终字符串VIEWNAME=“login”;
//...
//其他方法
//... 
@凌驾
公共无效输入(ViewChangeListener.ViewChangeEvent事件){
//初始化元素
组件loginForm=buildLoginForm();
addComponent(loginForm);
setComponentAlignment(loginForm,Alignment.MIDDLE_CENTER);
通知通知=新通知(“演示”);
通知。设置说明(“演示”);
通知。setHtmlContentAllowed(true);
notification.setStyleName(“托盘黑色小可关闭登录帮助”);
通知。设置位置(位置。底部_中心);
通知。setDelayMsec(20000);
notification.show(Page.getCurrent());
}
}
@Theme("mytheme")
@CDIUI("")
public class MyUI extends UI {

@Inject
LoginView loginView;

@Inject
private CDIViewProvider viewProvider;

@Override
protected void init(VaadinRequest vaadinRequest) {
    Navigator navigator = new Navigator(this, this);
    navigator.addProvider(viewProvider);
    navigator.navigateTo("login");
}
@UIScoped
@CDIView(LoginView.VIEWNAME)
public class LoginView extends VerticalLayout implements CustomView {

    public static final String VIEWNAME = "login";

   //...
   //other methods
   //... 

   @Override
   public void enter(ViewChangeListener.ViewChangeEvent event) {
      //initializations elements
      Component loginForm = buildLoginForm();
      addComponent(loginForm);
      setComponentAlignment(loginForm, Alignment.MIDDLE_CENTER);

      Notification notification = new Notification("Demo");
      notification.setDescription("<span>DEMO</span>");
      notification.setHtmlContentAllowed(true);
      notification.setStyleName("tray dark small closable login-help");
      notification.setPosition(Position.BOTTOM_CENTER);
      notification.setDelayMsec(20000);
      notification.show(Page.getCurrent());
    }
}