【问题标题】:Maximum language.properties file size in liferay custom portletsliferay 自定义 portlet 中的最大 language.properties 文件大小
【发布时间】:2014-02-27 23:32:34
【问题描述】:

当我尝试添加具有数千个具有长文本值的键的 Language.properties 文件时。 无法使用 <liferay-ui:message key="xyz" /> 检索我的 jsp 文件中的值。它没有显示任何值并在其输出中显示密钥。 我可以知道它支持的最大密钥数或最大文件大小。 我正在使用 Liferay 6.0.6 和 Tomcat 捆绑包。

在我的属性文件中,它包含 7600 行带有大键值的行。

InputStream stream = application.getResourceAsStream("/abc.properties");
Properties prop=new Properties();
prop.load(stream);

如果我使用上述代码从另一个属性文件中检索数据,则会出现以下错误。

 08:14:08,936 ERROR [jsp:154] java.lang.IllegalArgumentException: Malformed \uxxxx encoding.
       at java.util.Properties.loadConvert(Properties.java:569)
       at java.util.Properties.load0(Properties.java:392)
       at java.util.Properties.load(Properties.java:342)
       at org.apache.jsp.html.ahadith.sb_005fview11_jsp._jspService(sb_005fview11_jsp.java:158)
       at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
       at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
       at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
       at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
       at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
       at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
       at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
       at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)
       at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488)
       at com.liferay.portlet.PortletRequestDispatcherImpl.dispatch(PortletRequestDispatcherImpl.java:316)
       at com.liferay.portlet.PortletRequestDispatcherImpl.include(PortletRequestDispatcherImpl.java:105)
       at com.liferay.util.bridges.mvc.MVCPortlet.include(MVCPortlet.java:328)
       at com.liferay.util.bridges.mvc.MVCPortlet.include(MVCPortlet.java:343)
       at com.liferay.util.bridges.mvc.MVCPortlet.doDispatch(MVCPortlet.java:291)

提前致谢, 沙赫巴兹汗

【问题讨论】:

  • 您可以尝试在文件中使用较少的属性来检查您的配置是否正常吗?
  • 是的,我尝试使用较少的属性并且它可以工作,而当我添加数千个属性时它不起作用。

标签: java tomcat liferay portlet


【解决方案1】:

Liferay Portal 本身在平台文件中包含约 7400 行,它们运行良好。您遇到问题的大小顺序是什么?除了保存在内存中之外,我不知道任何与大小相关的限制。

您应该注意编码,并确保您的文件是 UTF-8 编码的。

另一种检查您是否真的受到大小而不是导致异常的特定值(您检查过您的日志文件吗?)的方法是:

  • 您说使用“较小”的文件一切正常。让我们将此内容命名为 A
  • 你也说当你在文件中添加几千行(我们称它们为B)时,A+B的结果不起作用
  • 如果您只尝试使用 B 怎么样:如果该文件中存在违规内容、编码等,您会通过这种方式发现。

另外,说到数千个语言键,这听起来很安静,令人印象深刻,考虑到整个门户(已经令人印象深刻的大小)与约 7400 个键配合使用。几乎值得质疑架构更改是否有序 - 但这只是一种直觉,您会比我更了解您的应用程序,并且您可以判断您需要在其中进行哪种翻译。

编辑:现在您已经编辑了问题,包括实际的堆栈跟踪:是的,您遇到了编码问题。使用 jdk 的native2ascii 程序将您的 ISO-8859-1 编码属性文件转换为 UTF-8。然后通过 Liferay 使用该文件:看起来您正在从 jsp 读取该文件 - 这意味着您很可能会在每个页面请求上都这样做,这是一种破坏门户性能的简单方法。

请注意,Liferay 以 UTF-8 格式读取属性文件,而 Properties.load(Stream) 始终假定 ISO-8859-1,因此您必须在使用 <liferay-ui:message key="some-key"/> 和自己加载资源包之间做出决定。两者都行不通。

【讨论】:

  • 因为你显然在那里有一个 unicode 转义,你可能需要native2ascii -reverse -encoding utf8 Language.properties > utf8-Language.properties。然后使用新文件。或者,如果文件中确实有 \uxxxx,则可能需要引用 \ 字符,否则 'xxxx' 应该是十六进制(因为 \u 开始一个 unicode 序列),请尝试 \\uxxxx。此外,您将必须决定是否使用portlet 资源包(需要为UTF-8)是否使用Properties.load( )(需要为 ISO-8859-1)。正如我上面所概述的,两者不能同时工作。
  • 我再次删除了 Language.properties 文件的一些内容,现在它包含 3600 行属性,它工作正常,而如果我将其增加到 3700,它不工作或从属性文件读取。 language.properties 文件大小为 10.0MB,代码 3600 行。
  • 尝试只是 100 行在 3600 和 3700 之间产生差异。根据您发布的内容,您没有有问题条目的数量,但有一个(或一些)特定条目遭受错误的编码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 2016-03-04
  • 2023-03-26
  • 2015-07-16
相关资源
最近更新 更多