用于注入 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