用于注入 EJB 的 Vaadin CDI 不起作用(Nullpointerexception 或 Forbidden)
Vaadin CDI for injecting EJBs doesn't work (Nullpointerexception or Forbidden)
首先,我在 SO 上看到了所有关于 Vaadin CDI 的类似问题,但其中 none 有助于解决我的问题。我在这里遇到了非常标准的场景:尝试使用单独的模块创建 EAR 应用程序,在这种情况下,这些模块只有 EJB (jar) 和 Web 应用程序 (war)。
我完全基于 Maven,构建和部署工作正常,所以我不会 post(那些长的)pom 文件。 WildFly 8.1.0 FINAL 用作应用服务器。
EJB 模块只包含一个无状态 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,带有一个 Button:
@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 class 的 servlet 部分。 Vaadin CDI 教程说删除这部分应该可以解决问题。但是,如果我这样做,我根本无法访问该 Web 应用程序,只会得到 Forbidden
.
有人可以提供帮助吗?还有什么可以更好地解释这应该如何协同工作?不幸的是,所有教程都缺少更多背景信息。
所以我解决了我的问题。
servlet 部分确实必须脱离我的代码,这样做 VaadinCDIServlet
会自动部署。
同样重要的是,WEBModules 中的 WEB-INF 文件夹 beans.xml
(可以为空)必须存在。
就是这样。现在它就像一个魅力。
此处提供更准确的信息 in the Book of Vaadin
首先,我在 SO 上看到了所有关于 Vaadin CDI 的类似问题,但其中 none 有助于解决我的问题。我在这里遇到了非常标准的场景:尝试使用单独的模块创建 EAR 应用程序,在这种情况下,这些模块只有 EJB (jar) 和 Web 应用程序 (war)。
我完全基于 Maven,构建和部署工作正常,所以我不会 post(那些长的)pom 文件。 WildFly 8.1.0 FINAL 用作应用服务器。
EJB 模块只包含一个无状态 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,带有一个 Button:
@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 class 的 servlet 部分。 Vaadin CDI 教程说删除这部分应该可以解决问题。但是,如果我这样做,我根本无法访问该 Web 应用程序,只会得到 Forbidden
.
有人可以提供帮助吗?还有什么可以更好地解释这应该如何协同工作?不幸的是,所有教程都缺少更多背景信息。
所以我解决了我的问题。
servlet 部分确实必须脱离我的代码,这样做 VaadinCDIServlet
会自动部署。
同样重要的是,WEBModules 中的 WEB-INF 文件夹 beans.xml
(可以为空)必须存在。
就是这样。现在它就像一个魅力。 此处提供更准确的信息 in the Book of Vaadin