即使返回,重定向也是jsf IllegalStateException

时间:2013-07-10 00:01:35

标签: jsf redirect servlet-3.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方法中做了。

修改

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

2 个答案:

答案 0 :(得分:2)

问题不在于是否存在return语句。问题是无法重置响应。让我们来看看这是由什么造成的:

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

根据source codeisCommitted()返回true时会抛出此内容。因此,响应已经提交。响应的一部分已经发送给客户。

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

答案 1 :(得分:1)

我遇到了类似的问题。问题是,在我调用我期望的那个之前,正在进行另一个重定向请求。因为已经有一个重定向请求,所以它抛出了IllegalStateException。