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