【问题标题】:How to catch NoSuchLayoutException in Liferay Velocity theme when layout not found?找不到布局时如何在 Liferay Velocity 主题中捕获 NoSuchLayoutException?
【发布时间】:2013-04-11 21:01:15
【问题描述】:

我在速度模板主题中有以下代码:

#set($currLayout = $layoutLocalService.getFriendlyURLLayout($group_id, true, $currFriendlyUrl))

抛出一个

com.liferay.portal.NoSuchLayoutException
    at com.liferay.portal.service.impl.LayoutLocalServiceImpl.getFriendlyURLLayout(LayoutLocalServiceImpl.java:959)

当匹配的布局不存在时。

如何在我的速度模板中捕捉到这个异常?

【问题讨论】:

  • 在 Liferay 中,您可以依赖 fetch*() 方法,因为它不会抛出异常,如果没有找到结果则返回 null。

标签: exception-handling liferay velocity liferay-6 liferay-velocity


【解决方案1】:

据我所知,不可能在速度模板中捕获异常。一般来说,这种情况有两种处理方式:

  • 处理使用模板的应用程序中的异常,例如servlet
  • 避免抛出异常;相反,让该方法始终返回一个有效的(默认)值,或者null(如果不可能)

velocity manual 建议尽可能使用第二个选项。

【讨论】:

  • 你是对的。经过一些研究,我发现不可能在速度模板中捕获异常。另一方面,我发布的“$layoutLocalService.getFriendlyURLLayout”方法是 Liferay 的方法,我无法控制它的行为,如果布局不存在,它会抛出异常。因此,一个解决方案是尝试以某种方式覆盖此方法或创建一个覆盖 liferay 中的某些 servlet 的钩子。我最终采用的另一种方法是尝试确保所有布局都存在,将此代码放在条件语句中。
  • 我只是想知道是否存在针对此类情况的更直接的安全方法。非常感谢您的回答!
  • 您的解决方案对我来说似乎很好,但我对 Liferay 并不熟悉。也许可以定义一个默认布局?
  • 总的来说听起来不错,谢谢。对于liferay的人来说,这可能是另一个问题,是否可以设置默认布局。尽管从 liferay API 来看,它似乎不支持开箱即用。 docs.liferay.com/portal/6.1/javadocs-all/com/liferay/portal/…
猜你喜欢
  • 2013-08-16
  • 2013-06-28
  • 2011-05-20
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
相关资源
最近更新 更多