EJB调用另一个EJB方法

时间:2009-07-08 13:57:26

标签: java-ee ejb-3.0

我更好奇这是最佳做法还是应该避免。假设我有两个EJBS,每个都使用不同类型的对象,一个小部件和一个foo。管理小部件的EJB需要获得一组foos来进行一些处理。此功能已在FooManager bean中创建。

正在创建WidgetManager中的方法,而已经创建了FooManager方法。

这是我的意思的一个例子。这是一个简短的例子。

@Stateless
public class FooManager implements FooManagerLocal, FooManagerRemote
{
   public List<Foo> getAllFoosForAWidget(widgetId)
   {
      //runs queries and builds foo list 
   }

   public Boolean isWidgetCloseable(widgetId)
   {
     //a widget is closeable if all foos for that widget are set to "done"

     List<Foo> foos = getallFoosForAWidget(widgetId);
     boolean isCloseable = false;
     //process foos and update isCloseable respectively
     return new Boolean(boolean);

   }

}

@Stateless
public class WidgetManager implements WidgetManagerLocal, WidgetManagerRemote
{
   public void closeWidgetIfFoosAreDone(widgetId) //needs to do stuff with foos
   { 
      //generate the widget based on widgetId
      Widget widget = find(Widget.class, widgetId) 


      //is this appropriate?
      //beans are gathered through our own beanclient
      FooManager fooManager = BeanClient.getBean(FooManager.class);
      if(fooManager.isWidgetCloseable(widgetId)
      {
         widget.setStatus(Close);
         save(widget); //save widget back to database
      }
   }
}

我的问题是,WidgetManager bean应该调用FooManager bean中已经创建的方法吗?客户端是否应该检查哪些窗口小部件可以关闭,然后将ID列表发送到WidgetManager?

我倾向于后一种情况,因此EJB不必担心调用彼此的方法。客户端可以使用它们,只需要发送一个id列表。

2 个答案:

答案 0 :(得分:3)

我会在WidgetManager中留下简单的'close'方法。通过这种方式,它与foo的关系会变得不那么紧张。

所以在其他一些Business Bean中,你将注入这两个bean并构建你的逻辑。

@Stateless
class SomeBusinessProcess implements ISomeBusinessProcess
{
   @EJB FooManagerLocal fooManager;
   @EJB WidgetManagerLocal widgetManager;

   public void process(WidgetId id)
   {
      if (fooManager.isClosable(id))
            widgetManager.close(id);
   }
}

通过这种方式,您将获得更多自由,并且您的经理bean将更加清晰。

答案 1 :(得分:1)

上述模式称为服务外观,在此处进行了详细讨论:http://www.adam-bien.com/roller/abien/entry/why_service_isn_t_a