避免在 ManagedBean 中重复代码的推荐方法是什么?

What is the recommended way to avoid repeated code in ManagedBeans?

至于良好的用户反馈,我在我的网络应用程序的多个站点上使用消息。

要添加消息,我简单地使用:

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

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

嗯,我对不同的站点使用不同的 ManagedBeans,这很正常。

我想到,将这些消息添加到不同 ManagedBeans 中的最佳做法是什么。

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

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

可能只是将此代码移至某些实用程序 class:

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

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

只需将重复的静态代码隐藏到可重用的 static 方法中,使其更 DRY ("Don't Repeat Yourself").

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

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

像这样,

Messages.addGlobalInfo(message);

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

addGlobalInfo(message);

它不需要是托管 bean,因为它不保存任何状态。此外,您应该将此类实用程序的默认构造函数设置为 class private,因此 Java/JSF 首先可以不通过 new 运算符或 Class#newInstance() 构造它在反思中。如果您使用的是 CDI,请在必要时使用 @Typed with an empty value to prevent it from being registered as managed bean candidate via Bean<T>.

对其进行注释
@Typed
public final class Messages {

    private Messages() {}

    // ...
}

JSF 实用程序库 OmniFaces has exactly this utility class: org.omnifaces.util.Messages.