使用ManagedProperty条件注入bean

时间:2014-03-17 15:53:18

标签: jsf cdi managed-property

我有一个具有以下属性的控制器:

@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吗?

非常感谢您的建议!

亲切的问候,

以星

1 个答案:

答案 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表达式(参见参考资料)。

另见: