访问 ResourceBundle 作为 ManagedProperty 序列化问题

Accessing ResourceBundle as ManagedProperty Serialization Issue

首先,抱歉我的英语不好!

在以下托管 Bean (ApplicationScoped) 中,我将 ResourceBundle(.properties) 作为 @ManagedProperty 进行访问。 ResourceBundle 对象不可序列化,所以我在 Eclipse/Tomcat 控制台中收到一个错误,指出该对象不能 serialized/de-serialized.. 等等

Exception loading sessions from persistent storage java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.util.PropertyResourceBundle

我对这个问题有 2 个问题:

非常感谢您的帮助。

@ManagedBean(name="facesResource",eager=true)
@ApplicationScoped
public class FacesResource implements Serializable{
    private static final long serialVersionUID = 2454454363100273885L;
    @ManagedProperty("#{FACES_CONFIG}")
    private ResourceBundle facesConfig;
    //private transient ResourceBundle facesConfig;

    ....
    private Map<String,Language> languagesMap;  
    private Map<String,Theme> themesMap;
    ....

    public FacesResource(){

    }
    @PostConstruct
    public void init(){
        System.out.println("*** FacesResource init ....");
        try{
            ....
            this.initLanguages();
            this.initThemes();
            ....
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }       

    public String getConfigurationAttribute(String attributeKey){
        return this.facesConfig.getString(attributeKey);
    }
    // ... other methods & getter/setter ...etc

}

更新:

不能在不可序列化的类型上使用@ManagedProperty。

它是本地化字符串的资源包吗?

读这个:http://www.mkyong.com/jsf2/jsf-2-0-and-resource-bundles-example/

FacesContext facesContext = FacesContext.getCurrentInstance();
ResourceBundle resourceBundle = facesContext.getApplication()
                                       .getResourceBundle(facesContext, "bundleName");

i think, JSF handles pre-defined(in faces-config.xml) ResourceBundles as ApplicationScoped beans.

没有。它们由 ResourceBundle API 本身管理。 JSF 只是根据请求的区域设置在每个请求的基础上解析它们(否则它会影响访问 Web 应用程序的任何用户的语言!)。因此,它们本质上是请求范围的。但这一切都与序列化无关。 ResourceBundle class 根本就没有打算序列化。它只是懒惰地将包加载到 Java 的内存中。

你最好也这样做。如果它在反序列化后变为 null 则延迟加载它。您只是不应该评估 #{FACES_CONFIG},因为它取决于请求区域设置。如果你只能使用 JSF <resource-bundle><var>,那么你最好通过 Application#getResourceBundle() 加载它们。提供了 FACES_CONFIG 的资源包 var 名称,这是一个示例:

private transient ResourceBundle facesConfig;

public ResourceBundle getFacesConfig() {
    if (facesConfig == null) {
        FacesContext context = FacesContext.getCurrentInstance();
        facesConfig = context.getApplication().getResourceBundle(context, "FACES_CONFIG");
    }

    return facesConfig; 
}

顺便说一句,变量名facesConfig很容易混淆。即表示代表faces-config.xml.

的内容

另请参阅:

  • java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException