避免在ManagedBeans中重复代码的建议方法是什么?

时间:2015-08-17 09:17:50

标签: jsf java-ee jsf-2

至于良好的用户反馈,我在webapplication中的多个站点上使用消息。

要添加消息,我只需使用:

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(type, "", message));

我为typemessage添加了变量,因为它取决于不同的验证。

好吧,我对不同的网站使用不同的ManagedBeans,这很正常。

我想到了,在不同ManagedBeans中添加这些邮件的最佳做法是什么。

目前,我总是使用上面的代码片段超过30次(而且它肯定会变得越来越多)。

我应该创建一个带有SessionScoped注释或@ApplicationScoped的Bean吗?你有其他任何提示,我应该知道吗?

2 个答案:

答案 0 :(得分:6)

只需将重复的静态代码隐藏到可重复使用的static方法中,使其更加DRY(“不要重复自己”)。

以最终重构的方式设计静态方法,

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(type, "", message));

这样的事情,

Messages.addGlobalInfo(message);

或甚至使用import static com.example.Messages.*;(Eclipse: Ctrl + Shift + M 该行):

addGlobalInfo(message);

它不需要是托管bean,因为它没有任何状态。此外,您应该创建此类实用程序类private的默认构造函数,因此Java / JSF首先不能通过new运算符或Class#newInstance()反射构造它。如果您正在使用CDI,请在必要时使用@Typed注释一个空值,以防止它通过Bean<T>注册为托管bean候选者。

@Typed
public final class Messages {

    private Messages() {}

    // ...
}

JSF实用程序库OmniFaces正好具有此实用程序类:org.omnifaces.util.Messages

答案 1 :(得分:2)

可能只是将此代码移动到某个实用程序类:

public void static addMessage(FacesMessage.Severity type, String message){
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(type, "", message));
}

您还可以使用一个参数创建多个方法:addInfoMessage,addErrorMessage,...