2017-09-13 1 views
1

Je classe MyUIComment obtenir une instance d'interface utilisateur dans CDIView à Vaadin?

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

@Inject 
LoginView loginView; 

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

... 

J'ai une vue avec une méthode d'initialisation annotée avec @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 

    } 
} 

Le stacktrace est:

Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.jboss.weld.injection.producer.DefaultLifecycleCallbackInvoker.invokeMethods(DefaultLifecycleCallbackInvoker.java:98) 
    ... 72 more 

Caused by: java.lang.NullPointerException 
    at com.vaadin.ui.Notification.show(Notification.java:378) 
    at com.test.claspina.view.LoginView.initView(LoginView.java:103) 
    ... 77 more 

Ma question est comment obtenir l'instance d'interface utilisateur à utiliser pendant le rendu des éléments de ma vue.

J'ai trouvé une solution partielle mettre toutes les définitions d'éléments dans une méthode de configuration, de cette façon:

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()); 
} 

Et appeler avant setContent dans mon interface utilisateur

loginView.configure(); 
setContent(loginView); 

Répondre

1

Enfin, avec l'aide de mon collègue, j'ai trouvé une solution:

Il est nécessaire d'utiliser CDIViewProvider cette façon

@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"); 
} 

Et dans la classe, définie le nom de la vue et de mettre toutes les définitions des éléments de la vue en entrant procédé

@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()); 
    } 
}