我如何从 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 是技术错误,而您处理的是业务层错误 - 两者的处理方式应有所不同。
我们的一位开发人员编写了一个使用 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 是技术错误,而您处理的是业务层错误 - 两者的处理方式应有所不同。