2014-04-27 6 views
1

Я хотел бы интегрировать Vaadin 7 с J2EE EJB, но у меня есть проблема, что я не могу искать компонент с состоянием из сервлета. Я прочитал учебник, который дает совет, как сделать эту интеграцию с CDI, но я не хочу использовать CDI.Интеграция Vaadin 7 + EJB (как добавить компонент состояния к сервлету)

Поэтому я переписываю учебник таким образом. Но служба поиска не находит мой бобы с состоянием - MyVaadinUI. Может ли кто-нибудь мне помочь? Что не так с моим кодом? Я не уверен, нужны ли мне специальные файлы конфигурации в модуле WAR, например ejb-jar.xml? Becouse У меня их нет. Мои приложения состоят из модуля EAR и EJB - где только модуль UserBean и WAR, где находится этот класс и jee6UiProveder. Благодаря

package cz.simon.webmailapp.web; 


@Theme("mytheme") 
@SuppressWarnings("serial") 
@Stateful 
@LocalBean 
public class MyVaadinUI extends UI{ 

@EJB 
private UserBean bean; 

@WebServlet(value = "/*", asyncSupported = true, 
initParams = { 
    @WebInitParam(name = "UIProvider", value = "cz.simon.webmailapp.web.Jee6UIProvider") }) 
@VaadinServletConfiguration(productionMode = false, ui = MyVaadinUI.class, widgetset = "cz.simon.webmailapp.web.AppWidgetSet") 
public static class Servlet extends VaadinServlet { 




public UI getUI() { 

     Context jndi = null; 
     UI ui = null; 
     try { 
      jndi = new InitialContext(); 
      ui = (UI) jndi.lookup("java:module/MyVaadinUI"); 
     } catch (NamingException ex) { 
      Logger.getLogger(MyVaadinUI.class.getName()).log(Level.SEVERE, null, ex); 
     } 


    return ui; 
} 
} 

@Override 
protected void init(VaadinRequest request) { 
    bean.setUser("Test"); 
    final VerticalLayout layout = new VerticalLayout(); 
    layout.setMargin(true); 
    setContent(layout); 

    Button button = new Button(bean.getUser() + "Click Me!!!"); 
    button.addClickListener(new Button.ClickListener() { 
     public void buttonClick(ClickEvent event) { 
      layout.addComponent(new Label("Thank you for clicking")); 
     } 
    }); 
    layout.addComponent(button); 
} 

}

+0

Какая ошибка вы получаете? Не могли бы вы объяснить, почему вы не хотите использовать CDI? Использование сессионных компонентов в модуле WAR EAR кажется не идеальным для меня и может быть проблемой. – raffael

+0

Вы, кажется, смешиваете компоненты пользовательского интерфейса и контроллера в целом ... вы должны попробовать уважать MVC ... –

ответ

0

Я не думаю, что вы делаете это правильно. вам нужно либо использовать CDI для пользовательского интерфейса для инъекций EJB, либо явно искать beans. Поскольку вы не хотите использовать CDI для своего пользовательского интерфейса, единственным вариантом, оставшимся для вас, является поиск.

@Override 
    protected void init(VaadinRequest request) { 
     try { 
      //TODO Create a getter method that returns you the JNDI name of the bean 
      userBean = (UserBean) lookup(getJNDINameOfUserBean()); 
     } catch (NamingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     //TODO do other Stuff. 
    } 

    private Object lookup(String jndiName) throws NamingException{ 
     if(null==context){ 
     initContext(); 
     } 
     return context.lookup(jndiName); 

    } 

    private void initContext() throws NamingException{ 
     //Set properties if any and initialize the context 
     // Class level variable for Context 
     context = new InitialContext(); 
    } 
Смежные вопросы