2011-12-06 66 views
2

我正在开发一个带有jsf2,spring和hibernate的web应用程序。JSF应用程序范围的托管bean注入

我有一个“应用程序为作用域”托管bean(称为“utilsJSF”)与JSF util的方法,如:

  • 读取特性文件(使用的getBundle)根据其密钥获得的消息。
  • 将一个字符串添加为稍后在视图中显示的facesmessage。

我注入在我的“基本控制器”这个bean(称为“托管属性”),让我所有的控制器扩展这一项,并且可以访问这些工具。在这里我没有问题。

但是,如何从其他不是“托管的bean”的类使用这些实用程序?

我将解释自己:

我有一个异常层次结构,其中每一个特定的异常类具有访问资源包(属性文件),其中关键是异常的名称和值是消息我要展示给用户。异常构造函数从文件中获取值,将其存储在异常字段中,然后控制器将消息显示为面向消息的用户。

我可以使用“utilsJSF”托管bean显示来自控制器的消息,因为我将它注入到BaseController中。

但我不能注入“utilsJSF”到异常类中以便使用它(因为异常类不是托管的bean)。

解决此问题的最佳解决方案是什么?

回答

2

您应该将所有这些实用方法(即(或可能)为public static)重构为实用类,而不是将其保留在应用程序作用域bean中。

public final class Faces { 

    private Faces() { 
     // Prevent construction. 
    } 

    public static void addGlobalInfoMessage(String summary) { 
     FacesContext.getCurrentInstance().addMessage(null, 
      new FacesMessage(FacesMessage.SEVERITY_INFO, summary, null)); 
    } 

    // ... 
} 

这样你可以在任何地方使用它。创建一个类似的获取捆绑消息。

+0

非常感谢BalusC。使用静态方法是我的第一个解决方案,它的工作原理。我只是想知道如果有另一种方式。事实上,我尝试将utils方法放在应用程序范围的bean中,只是因为我在网站上阅读它。但我认为应用程序范围的bean用于存储应用程序数据(常量,静态列表等),而不是保存实用程序方法,难道你不这么认为吗?谢谢,我非常感谢你,并阅读你的网页。 (对不起,如果我的英语不是很好,但我来自西班牙)。 – choquero70

+0

如果这个类没有任何状态,那么就没有必要把它变成一个有状态的类。然而,应用程序范围的bean对于将应用程序范围的数据展示到视图中非常有用,例如静态下拉列表。 – BalusC