我有一个具有以下属性的控制器:
@ManagedProperty(value="#{remoteApplication}")
private transient ProcessService applicationService;
@ManagedProperty(value="#{remoteSystem}")
private transient SystemService systemService;
@ManagedProperty(value="#{remoteFileSystem}")
private transient FileSystemService fileSystemService;
我想有条件地注入bean,根据一个属性文件告诉服务是本地的还是远程的。
上面提供的示例用于远程,而对于本地,则为:
@ManagedProperty(value="#{localApplication}")
private transient ProcessService applicationService;
@ManagedProperty(value="#{localSystem}")
private transient SystemService systemService;
@ManagedProperty(value="#{localFileSystem}")
private transient FileSystemService fileSystemService;
有没有办法用JSF执行此操作(可能使用ManagedProperty documentation中指定的ValueExpression
)?或者我必须使用CDI吗?
非常感谢您的建议!
亲切的问候,
以星
答案 0 :(得分:2)
你可以只用JSF来做,即使是CDI集成也可以帮助你将它分成适当的层。看看这个JSF解决方案,使用管理配置的应用程序作用域bean。 Bean
的范围可以是您需要的任何人。成为您的服务类@ManagedBean
:
@ManagedBean
@ApplicationScoped
public class LocalProcessService implements ProcessService {
public LocalProcessService() {
System.out.println("Local service created");
}
}
@ManagedBean
@ApplicationScoped
public class RemoteProcessService implements ProcessService {
public RemoteProcessService() {
System.out.println("Remote service created");
}
}
然后,实现一个读取所需文件的配置Bean,并存储一个带有读取值的标志。我使用Random
函数进行测试:
@ManagedBean(eager = true)
@ApplicationScoped
public class PropertiesBean {
private boolean localConfig = false;
public PropertiesBean() {
// Read your config file here and determine wether it is local
//or remote configuration
if (new Random().nextInt(2) == 1) {
localConfig = true;
}
}
public boolean isLocalConfig() {
return localConfig;
}
}
一旦你得到它,在视图控制器中使用三元运算符根据该标志值进行注入:
@ManagedBean
@ViewScoped
public class Bean {
@ManagedProperty(value = "#{propertiesBean.localConfig ? localProcessService : remoteProcessService}")
protected ProcessService processService;
public void setProcessService(ProcessService processService) {
this.processService = processService;
}
}
或者,您可以将服务引用直接存储在PropertiesBean
中,以便不必在托管bean中评估该标记值。只需在上下文中评估所需的EL表达式(参见参考资料)。
另见: