我如何从 Liferay/Java 中的 doView return 状态 404

How do I return status 404 from doView in Liferay/Java

我们的一位开发人员编写了一个使用 doView 方法呈现相关内容的 portlet。但是,如果用户在没有有效记录的情况下访问该 Portlet 的有效路由下的页面,我们将收到 NPE。

一个例子是:

/<location>/<postcode>/<propertyname>

/london/w1/唐宁街 10 号 - 有效

/london/w1/sdsd-downing-streetsss - 无效

slug 将从数据库中提取记录,因为它是唯一的,但如果它无效,它会在 fillRenderRequestAttributes 上抛出 NPE,我们需要它抛出状态 404。

代码

public void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException {

    fillRenderRequestAttributes(renderRequest, renderResponse);
    
    if(_log.isDebugEnabled())
    {
       _log.debug("DoView");
    }
    try
    {
       super.doView(renderRequest, renderResponse);
    }
    catch(Exception e)
    {
       _log.debug("Broken");
       e.printStackTrace();
    }
    
}

我假设我们需要 try/catch 围绕 fillRenderRequestAttributes 并且在 catch 中我们需要抛出 404?如何才能做到这一点?任何示例都会有所帮助。

doView 正在呈现 portlet 的输出,不是 整页。因此,它没有状态代码。该页面在其他地方呈现(例如,用主题装饰,以及页面上可能仍显示相关内容的任意数量的其他 portlet)。

在 portlet 世界中,您处理的不是 HttpServletRequest/Response 对,而是 PortletRequest/Response 对(如此处所示RenderRequest/Response)。在 HTTP return 代码中思考是错误的:您甚至不能保证在响应已经发送回浏览器之前呈现 portlet:一旦您确定您的 portlet无法呈现适当的输出,页面可能已经在路上,状态代码为 200。或者它可能被异步呈现并只是注入到页面中。

如果 portlet 无法在 doView 中呈现适当的输出,您将需要捕获异常并在 portlet 中显示正确的错误消息

否则,请考虑实施 serveResource,在其中您有更多控制权或 REST 端点。但请注意:404 是技术错误,而您处理的是业务层错误 - 两者的处理方式应有所不同。