JSF应用程序范围的托管bean注入

JSF应用程序范围的托管bean注入,jsf,scope,javabeans,managed,Jsf,Scope,Javabeans,Managed,我正在开发一个web应用程序,使用jsf2、spring和hibernate 我有一个带有JSF util方法的“应用程序范围”托管bean(称为“utilsJSF”),例如: 读取属性文件以从其密钥获取消息(使用getBundle) 添加字符串作为稍后在视图上显示的facesmessage 等 我将这个bean注入到我的“基本控制器”(作为“托管属性”)中,以便我的所有控制器扩展这个bean,并可以访问这些实用程序。在这里我没有问题 但是,如何使用其他非“托管bean”类中的这些实用程序呢

我正在开发一个web应用程序,使用jsf2、spring和hibernate

我有一个带有JSF util方法的“应用程序范围”托管bean(称为“utilsJSF”),例如:

  • 读取属性文件以从其密钥获取消息(使用getBundle)
  • 添加字符串作为稍后在视图上显示的facesmessage
我将这个bean注入到我的“基本控制器”(作为“托管属性”)中,以便我的所有控制器扩展这个bean,并可以访问这些实用程序。在这里我没有问题

但是,如何使用其他非“托管bean”类中的这些实用程序呢

我会解释:

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

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

但是我不能为了使用它而将“utilsJSF”注入异常类(因为异常类不是托管bean)


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

您应该将所有这些实用程序方法(那些是(或可以是)
公共静态的方法)重构为一个真正的实用程序类,而不是将其保留在应用程序范围的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));
    }

    // ...
}

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

非常感谢您,巴卢斯克。使用静态方法是我的第一个解决方案,它是有效的。我只是想知道是否还有别的办法。事实上,我试着将utils方法放在应用程序范围的bean中,只是因为我在网站上读到了它。但我认为应用程序范围的bean用于存储应用程序数据(常量、静态列表等),而不是保存实用程序方法,您不这么认为吗?谢谢你,我非常感谢你和阅读你的网站。(很抱歉,如果我的英语不是很好,但我来自西班牙)。如果这个班没有州,那么就没有必要让它成为一个有州的班。然而,应用程序范围的bean对于将应用程序范围的数据公开到视图(如静态下拉列表)中非常有用。