2017-06-21 27 views
0

我想要一个可以触发事件的类。理想情况下,我想在POJO中处理它(处理POJO中的遗留代码),但我知道这是不可能的。所以相反,我想有一些POJO可以调用哪些可以触发事件的东西。我可以注入CDI事件的类/实例的类型是什么?

注:我在Tomcat与CDI,JPA还安装(它不是切换到全EE服务器在这个项目上的一个选项)

我不知道这是否应该是一个单身/应用程序范围内的单身人士,或者应该按照请求(甚至会话)。所以我的问题是:

  1. 什么事件可以注入? (例如@WebListener@SingletonRequestScoped@Stateless

  2. 哪一个做这个用例中最有意义?

  3. POJO如何访问该类/实例(从servlet调用POJO)?

示例代码:

//Is this correct? 
@WebListener 
public class EventHandler 
{ 
    @Inject 
    @MyEventQualifier 
    private Event<MyEvent> myEvent; 

    public void fireEvent(MyEvent anEvent) 
    { 
     myEvent.fireAsync(anEvent); 
    } 
} 

回答

1

基本容器类是你的标准的 “管理” 对象,如你所列出的一个(WebListeners,过滤器,Servlet的)。这些作为上下文链的根源。由于这些由CDI管理,所以它们的任何注入也都被管理,并且在那条线上。

如果您的Servlet(例如)注入PojoX,PojoX可以注入PojoY等。游戏是为了避免new并使用CDI构造来创建你的POJO。

至于跨越传统的POJO/CDI鸿沟,你可以做几件事情。

您可以将EventHandler的实例注入到Servlet中,然后将该实例作为参数传递给POJO。

可以将该实例作为属性附加到请求中,或者在首次创建Servlet时将实例推送到ServletContext。

您可以使EventHandler为@Singleton并在其@PostConstruct中设置一个静态变量,该静态变量可以通过标准静态getInstance调用返回。

您可以让POJO直接调用容器来执行查找(或称为效用函数)。

而且,当然,如果POJO可以自己注入,就这样做。

附录的评论:

你可以简单地注入POJO,如果这是适合你的工作。

下面是一个例子:

@WebServlet(name = "NewServlet", urlPatterns = {"/NewServlet"}) 
public class NewServlet extends HttpServlet { 

    @Inject 
    Instance<Pojo> pojoInstance; 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     Pojo pojo = pojoInstance.get(); 
     String world = pojo.getWorld(); 

     response.setContentType("text/html;charset=UTF-8"); 
     try (PrintWriter out = response.getWriter()) { 
      /* TODO output your page here. You may use following sample code. */ 
      out.println("<!DOCTYPE html>"); 
      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>Servlet NewServlet</title>"); 
      out.println("</head>"); 
      out.println("<body>"); 
      out.println("<h1>Servlet NewServlet at " + request.getContextPath() + "</h1>"); 
      out.println("<p>Hello " + world); 
      out.println("</body>"); 
      out.println("</html>"); 
     } 
    } 
} 

public class Pojo { 

    @Inject 
    Event<PojoEvent> pojoEventHdlr; 

    @PostConstruct 
    public void postConstruct() { 
     System.out.println("Look, another Pojo!"); 
    } 

    public String getWorld() { 
     PojoEvent pe = new PojoEvent("World event pojo fired"); 
     pojoEventHdlr.fire(pe); 

     return "world"; 
    } 
} 

public class PojoEvent { 

    String msg; 

    public PojoEvent() { 
    } 

    public PojoEvent(String msg) { 
     this.msg = msg; 
    } 

    public String toString() { 
     return "PojoEvent with msg: " + msg; 
    } 
} 

@Singleton 
public class SingletonPojo { 

    public void pojoEventObserver(@Observes PojoEvent pe) { 
     System.out.println("We got a PojoEvent " + pe); 
    } 
} 

要注意的重要的事情,是我在给servlet注入的Instance<Pojo>,然后就可以使用Instance.get,而不仅仅是直接的POJO。原因是Servlet在Web应用程序中名义上是Singleton,所以如果你注入了一个实际的Pojo,你所有的请求都会使用完全相同的Pojo实例(不太可能是你想要的)。

您可以看到Pojo激发事件,并且我有一个@Singleton类观察事件并且抛出消息。

如果您愿意对您的旧版代码进行更改,您可以按照自己喜欢的方式进行操作,并且不需要花费大量时间来弥补CDI < - >旧版鸿沟。只需将它们滚入CDI即可。

+0

对于最后一个,我将如何注入POJO?如果是空白的,我是否可以将事件注入POJO? –

相关问题