Jakarta ee vaadin7+EJB集成(如何将有状态bean注入servlet)

Jakarta ee vaadin7+EJB集成(如何将有状态bean注入servlet),jakarta-ee,servlets,ejb,vaadin,Jakarta Ee,Servlets,Ejb,Vaadin,我想将vaadin7与j2eeejb集成,但我有一个问题,我无法从servlet中查找有状态bean。我读了一篇教程,其中给出了如何与CDI集成的建议,但我不想使用CDI 所以我像这样重写了教程。但查找服务找不到我的有状态bean-MyVaadinUI。有人能帮我吗?我的代码有什么问题?我不确定在WAR模块中是否需要一些特殊的配置文件,比如ejb-jar.xml?因为我没有。我的应用程序由EAR模块和EJB组成,其中只有UserBean和WAR模块,其中是此类和jee6UiProveder。谢谢

我想将vaadin7与j2eeejb集成,但我有一个问题,我无法从servlet中查找有状态bean。我读了一篇教程,其中给出了如何与CDI集成的建议,但我不想使用CDI

所以我像这样重写了教程。但查找服务找不到我的有状态bean-MyVaadinUI。有人能帮我吗?我的代码有什么问题?我不确定在WAR模块中是否需要一些特殊的配置文件,比如ejb-jar.xml?因为我没有。我的应用程序由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);
}

}我认为你做得不对。您必须使用CDI for UI注入EJB,或者显式查找bean。由于您不想在UI类中使用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();   
   }

您得到的错误是什么?您能解释一下为什么不想使用CDI吗?在EAR的WAR模块中使用会话bean对我来说似乎并不理想,可能是个问题。您似乎将UI和控制器组件混合在一起。。。你应该尊重MVC。。。