Liferay 使用钩子覆盖 JSONAction

Liferay overriding JSONAction using hook

Liferay 具有使用挂钩修改 Struts 动作的功能,非常简单。但是我试图覆盖 RateEntryAction 的 getJSON 方法。

用例是我需要总正面分数和总负面分数,而不是 Liferay 的 OOTB 评级组件提供的平均分数。

我已经在 Liferay API 中有了必要的方法来获得总的正面和负面分数。我创建了一个自定义类型,就像 "stars" 和 "votes" 一样,以在钩子中编写我必要的逻辑。然后我计划覆盖由 /portal/rate_enty 表示的 struts 操作以覆盖该方法并在已经返回的 json 中添加反对票和肯定票。

但是 RateEntryAction(原来的 class)正在扩展 JSONAction 并覆盖 getJSON 方法。是否可以使用 struts 操作挂钩仅覆盖 getJSON 方法?

由于 RateEntryAction 不是 Struts 操作,您不能使用 Struts 操作挂钩重载它。我不知道有任何可挂钩的方式来覆盖它,因此我最好的猜测是你必须要么去 ext 要么引入一个全新的 JSON API 函数并挂钩 Liferay 中的所有地方参考原始实施,现在转到您的实施。

我怀疑在这种情况下,ext 插件会更易于维护。如果我错了,有人纠正我。

根据我的研究,我们只能挂钩 com.liferay.portal.struts.PortletAction sub classes,是的 JSONAction 也扩展 org.apache.struts.action.Action class 与 PortletAction 相同,但 liferay 只允许那些 classes hookable 在 PortletAction class 下,除此之外。

我可以在 struts-config.xml 中看到此操作 class,因此它是一个 Struts 操作。 这是您可以尝试覆盖的路径。

<action path="/portal/rate_entry" type="com.liferay.portal.action.RateEntryAction" />

我会尝试覆盖此路径,看看是否可以将您的逻辑放在那里。

RateEntryAction 扩展自 JSONAction,而这个扩展自 org.apache.struts.action.Action,这与 PortletAction 扩展的 class 相同。

希望对您有所帮助