1

我正在尝试使用ExternalContext中的getResourcePaths()方法获取 WAR 文件中的资源路径。但是如果方法被调用怎么办?在这种情况下,FacesContext 为空。@Schedule

@Schedule(hour = "*", minute = "0,30", second = "0")
public void foo() {
  ExternalContext ctx = FacesContext.getCurrentInstance().getExternalContext();
  Set<String> resources = ctx.getResourcePaths("/WEB-INF/");
  ...
}

我知道 FacesContext 仅在请求中有效。是不是还有什么妙招?

4

1 回答 1

1

约定说,在三层软件架构中,一层只能访问底层而不能访问覆盖层(严格三层架构中的下一个底层,灵活三层架构中的所有底层)。我知道的唯一例外是观察者模式:当数据发生变化时,主体会通知所有附加的观察者。这是通过从主体层到观察者层的弱引用来实现的。

我对这个问题的解决方案是,我编写了一个应用程序阶段监听器(当然位于 ui 层),它WEB-INF在应用程序启动时扫描资源文件夹。这是合法的,因为应用程序阶段侦听器在面孔上下文中运行。

直到 JSF 2.1 为止,阶段侦听器都不是注入目标(请参阅stackoverflow 中的此处)。所以有必要通过 JNDI 获取我的 EJB 引用。然后自动实例化 EJB(位于模型层)。

应用阶段监听器:

@Override
public void processEvent(SystemEvent e) {
  if(e instanceof PostConstructApplicationEvent) {
    try {
      // getting ejb by jndi
      InitialContext iCtx = new InitialContext();
      EjbService ejbService = (EjbService) iCtx.lookup("java:module/EjbService");

      // fetching resources
      ExternalContext eCtx = FacesContext.getCurrentInstance().getExternalContext();
      Set<String> resources = eCtx.getResourcePaths("/WEB-INF/");

      // setting resources into ejb
      ejbService.setResources(resources);
    } catch(NamingException e1) {
      e1.printStackTrace();
    }
  }
}

非常感谢所有帮助回答我的问题的人。

于 2013-07-04T09:18:41.187 回答