java - <f :loadBundle basename Non-serializable attribute

标签 java jsp jsf jakarta-ee icefaces-1.8

我正在所有 session 类上实现可序列化,这样我就可以使用负载均衡器进行一些农场集群。

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

每当我输入 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 是 getter,而不是 setter:

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(".")));
}

可能出了什么问题?

最佳答案

实际上,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>

关于java - <f :loadBundle basename Non-serializable attribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11258541/

相关文章:

java - 不带参数访问列表中的下一个元素

java - 支柱2 : double values with point or comma

java - 来自 javabean 的 JSP 分页

html - 复合组件和 CSS

java - 多次按键有时仅注册

java - 使用 @PrePersist 和 @PreUpdate 时,创建的日期字段在更新时变为空

java - JTabbedPane点击事件

jsp - session 在 struts 2.0 中启动

JSF/Facelets : why is it not a good idea to mix JSF/Facelets with HTML tags?

java - 打印/导出 bootstable 数据表中的选定列