首先,我在这里看到了关于Vaadin CDI的所有类似问题,但没有一个能帮我解决问题。我在这里得到了相当标准的场景:尝试使用分离的模块创建EAR应用程序,在这种情况下只有EJB(jar)和Web应用程序(war)。
我完全基于Maven,构建和部署工作正常,所以我还没有发布(那些很长的)pom文件。 WildFly 8.1.0 FINAL用作应用程序服务器。
EJB Module只包含一个无状态bean:
@Stateless
public class Greeter implements GreetinInterface {
private final String[] greets = new String[]{"Hi", "Ho", "Hey", "Hello"};
@Override
public String greet() {
return greets[new Random().nextInt(greets.length)];
}
}
@Local
public interface GreetinInterface {
String greet();
}
Bean已成功部署,这由WildFly管理控制台和以下输出确认:
21:50:20,275 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-6) JNDI bindings for session bean named Greeter in deployment unit subdeployment "WEBModule.war" of deployment "EARModule.ear" are as follows:
java:global/EARModule/WEBModule/Greeter!cz.kousalik.GreetingInterface
java:app/WEBModule/Greeter!cz.kousalik.GreetingInterface
java:module/Greeter!cz.kousalik.GreetingInterface
java:global/EARModule/WEBModule/Greeter
java:app/WEBModule/Greeter
java:module/Greeter
WEB模块包含由netbeans中的Vaadin插件生成的简单Vaadin应用程序。仅包含一个UI,只有一个按钮:
@CDIUI
@Theme("mytheme")
@Widgetset("cz.kousalik.pernik.web.MyAppWidgetset")
public class MyUI extends UI {
@Inject
private GreetinInterface greeter;
@Override
protected void init(VaadinRequest vaadinRequest) {
final VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
setContent(layout);
Button button = new Button("Click Me");
button.addClickListener(e -> layout.addComponent(new Label("Thank you for clicking, " + greeter.greet())));
layout.addComponent(button);
}
@WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
@VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
public static class MyUIServlet extends VaadinServlet {
}
}
在这种情况下,应用程序会运行,但单击Button会导致Nullpointer异常,因为greeter
字段内没有任何内容。
在阅读了几篇教程后,我相信问题出在我的UI类的servlet部分。 Vaadin CDI教程说删除这部分应该可以解决问题。但是,如果我这样做,我根本无法访问网络应用,而只是Forbidden
。
有人可以提供帮助,还有什么可以更好地解释这应该如何协同工作?遗憾的是,所有教程都缺少更多背景信息。
答案 0 :(得分:0)
所以我解决了我的问题。
servlet部分确实必须远离我的代码,这样就可以自动部署VaadinCDIServlet
。
同样重要的是,WEBModules内部的WEB-INF文件夹beans.xml
(可以为空)必须存在。
那就是它。现在它就像一个魅力。 这里提供更准确的信息in the Book of Vaadin