用于注入EJB的Vaadin CDI不起作用(Nullpointerexception或Forbidden)

时间:2015-06-05 04:44:09

标签: java-ee ejb vaadin wildfly-8

首先,我在这里看到了关于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

有人可以提供帮助,还有什么可以更好地解释这应该如何协同工作?遗憾的是,所有教程都缺少更多背景信息。

1 个答案:

答案 0 :(得分:0)

所以我解决了我的问题。

servlet部分确实必须远离我的代码,这样就可以自动部署VaadinCDIServlet

同样重要的是,WEBModules内部的WEB-INF文件夹beans.xml(可以为空)必须存在。

那就是它。现在它就像一个魅力。 这里提供更准确的信息in the Book of Vaadin