【问题标题】:<f:loadBundle basename Non-serializable attribute<f:loadBundle basename 不可序列化的属性
【发布时间】:2012-06-30 19:02:47
【问题描述】:

我正在我的所有会话类上实现 Serializable,因此我可以使用负载平衡器进行一些农场集群。

我已经控制了集群并且它工作正常。但是,我遇到了一个似乎无法解决的错误。

每当我在 index.jsp 上输入时,我都会收到此错误:

Mensaje: javax.servlet.ServletException: java.lang.Exception: javax.faces.FacesException: Problem in renderResponse: /WEB-INF/inc-content/content.jspx @5,73 <f:loadBundle basename="#{idioma.messageBundleSinProp}"> /WEB-INF/inc-content/content.jspx @5,73 basename="#{idioma.messageBundleSinProp}" setAttribute: Atributo no serializable 
Tipo Error: class javax.servlet.ServletException 
Excepcion: javax.servlet.ServletException: java.lang.Exception: javax.faces.FacesException: Problem in renderResponse: /WEB-INF/inc-content/content.jspx @5,73 <f:loadBundle basename="#{idioma.messageBundleSinProp}"> /WEB-INF/inc-content/content.jspx @5,73 basename="#{idioma.messageBundleSinProp}" setAttribute: Atributo no serializable 
Codigo de Estado: 500 
Nombre Servlet: jsp 

尽管是西班牙语,但它基本上说该属性不可序列化。似乎我遗漏了一些东西,因为 idioma.messageBundleSinProp 是一个吸气剂,而不是一个二传手:

public String getMessageBundle()
{
    if(idiomaSeleccionado!=null)
        return(webUtil.getPropertiesValue(idiomaSeleccionado, "LanguageChances.properties"));
    else
        return(webUtil.getPropertiesValue(idiomaSeleccionadoDefecto, "LanguageChances.properties"));
}

public String getMessageBundleSinProp()
{
    //String propertieSeleccionado=getMessageBundle();
    return(getMessageBundle().substring(0,getMessageBundle().indexOf(".")));
}

可能出了什么问题?

【问题讨论】:

    标签: java jsp jsf jakarta-ee icefaces-1.8


    【解决方案1】:

    实际上 loadBundle 组件是从 JSF 2.0 开始的。

    Source Code JSF 1.2

    Source Code JSF 2.0

    因为您也没有使用 Icefaces 2.0。你也不能利用这个。 ICEFACES JIRA

    所以我能想到的唯一方法是创建自己的 messageBean 并检索消息。

    你可以这样做:

    public class MessageBean implements Serializable
    {
    
       transient private static ResourceBundle bundle;
       transient private static Map map;
    
    protected static ClassLoader getCurrentClassLoader(Object defaultObject)
    {
      ClassLoader loader = Thread.currentThread().getContextClassLoader();
      if (loader == null)
      {
         loader = defaultObject.getClass().getClassLoader();
      }
      return loader;
    }
    
    MessageBean()
    {
      bundle = ResourceBundle.getBundle("LanguageChances", java.util.Locale.getDefault(), getCurrentClassLoader(null));
      map = new HashMap<String, Object>();
      Enumeration<String> keys = bundle.getKeys();
      while (keys.hasMoreElements()) {
          String key = keys.nextElement();
          Object value = bundle.getObject(key);
         map.put(key, value);
      }
    }
    
    public Map getMap(){
      return map;
    }
    }
    

    并在您的页面上使用类似的内容来检索消息:

    <c:forEach items="#{messageBean.map}" var="entry">
      <h:outputText value="#{entry.key}"/>
    </c:forEach>
    

    【讨论】:

    • 我们为应用程序上的每种语言加载一个 MessageBundle。那么,我如何加载 messageBundleSinProp ?那个在运行时被替换为需要加载的任何包。
    • @Antonio 您如何通过系统属性指定要加载的包?
    • 真的是来自IdomaBean 类的吸气剂,它基本上是:getMessageBundle().substring(0,getMessageBundle().indexOf("."))。 MessageBundle 在登录时选择,具体取决于某些参数,例如国家代码或浏览器标头。
    猜你喜欢
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多