Java

Java ,java,jsp,jsf,jakarta-ee,icefaces-1.8,Java,Jsp,Jsf,Jakarta Ee,Icefaces 1.8,我正在我所有的会话类上实现Serializable,这样我就可以使用负载平衡器进行一些服务器场集群 我已经控制了集群,它工作得很好。然而,我得到了一个错误,似乎我无法解决 每当我在index.jsp上输入时,我都会收到以下错误: Mensaje: javax.servlet.ServletException: java.lang.Exception: javax.faces.FacesException: Problem in renderResponse: /WEB-INF/inc-conte

我正在我所有的会话类上实现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 

有什么问题吗?

实际上,loadBundle组件是从JSF2.0中临时生成的

因为您也没有使用IceFaces2.0。你也不能利用这个。

所以我能想到的唯一方法就是创建自己的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>

实际上,loadBundle组件是从JSF2.0中临时生成的

因为您也没有使用IceFaces2.0。你也不能利用这个。

所以我能想到的唯一方法就是创建自己的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类的一个getter,基本上是这样做的:getMessageBundle.substring0,getMessageBundle.indexOf。。MessageBundle是在登录时选择的,具体取决于某些参数,如国家代码或浏览器标题。我们为应用程序上的每种语言加载MessageBundle。那么,如何加载messageBundleSinProp?这个包在运行时会被需要加载的包所替换。@Antonio您是如何通过系统属性指定要加载的包的?它确实是IdomaBean类的一个getter,基本上是这样做的:getMessageBundle.substring0,getMessageBundle.indexOf。。MessageBundle是在登录时选择的,具体取决于某些参数,如国家代码或浏览器标题。