约定说,在三层软件架构中,一层只能访问底层而不能访问覆盖层(严格三层架构中的下一个底层,灵活三层架构中的所有底层)。我知道的唯一例外是观察者模式:当数据发生变化时,主体会通知所有附加的观察者。这是通过从主体层到观察者层的弱引用来实现的。
我对这个问题的解决方案是,我编写了一个应用程序阶段监听器(当然位于 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();
}
}
}
非常感谢所有帮助回答我的问题的人。