Jakarta ee 如何在Vaadin中获取CDIView中的UI实例?
我有MyUI课程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
@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());
}
}