0

在我preRenderView调用的方法中,会执行一些验证,如果失败,则会发生重定向。

但我得到一个IllegalStateException

Information: Exception when handling error trying to reset the response.
java.lang.IllegalStateException
    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:524)
    at com.sun.faces.context.ExternalContextImpl.redirect(ExternalContextImpl.java:602)
    at package.FacesContextUtils.redirect(FacesContextUtils.java:581)

这是代码:

public void initPreRenderView(final String value) throws DatabaseException
{
    if (value == null)
    {
        FacesContextUtils.addMessageInvalidLinkRedirect(context, url);
        return;
    }
}

基本上,效用函数包括:

public static void addMessageInvalidLinkRedirect(FacesContext context, String url)
{
    context.addMessage(null, new FacesMessage("Invalid link..."));
    try
    {
        context.getExternalContext().redirect(url);
    }
    catch (final IOException e)
    {
        // add error message
    }
}

关于这个主题的许多答案都假设在重定向语句之后添加一个返回,我在 preRenderView 方法中做了。

编辑:

重定向发生,一切都按预期工作。只是想摆脱这个错误信息。

4

2 回答 2

2

问题不在于 return 语句的存在与否。问题是无法重置响应。让我们看看这是哪里引起的:

java.lang.IllegalStateException
    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:524)

根据源代码,这将在isCommitted()返回时抛出true。因此,响应已经提交。响应的一部分已经发送给客户端。

您的问题中没有任何内容表明这一点。因此,必须在迄今为止提供的信息之外的其他地方寻找问题的原因。在标准的 JSF 上,这不应该发生,所以也许你在某个地方有一个 servlet 过滤器,它正在设置/提交一些标头?

于 2013-07-11T15:08:49.983 回答
1

我遇到了类似的问题。事实证明,在我调用我期望的重定向请求之前,正在发出另一个重定向请求。因为已经发出了一个重定向请求,所以它抛出了 IllegalStateException。

于 2014-02-20T21:36:52.093 回答