0

我正在使用 Grails 2.2.3 作为应用程序来清除我们数据库中的重复人员。当我尝试访问控制器操作时,我收到以下错误:

Error Caused by: org.codehaus.groovy.grails.web.servlet.mvc.exceptions.CannotRedirectException: Cannot issue a redirect(..) here. A previous call to redirect(..) has already redirected the response.

它看起来像一个无限重定向循环,因为控制台中的 Stacktrace 会在我执行duplicate()操作时立即变得疯狂。它一直打印,直到我Ctrl+C离开控制台。此外,还有多个屏幕可用于处理和修复副本,这就是为什么我要提供一种存储“工作”副本的方法。

控制器动作:

  • setWorkingDuplicate- 在每个页面上设置一个副本以使用(因此用户不必继续输入)。
  • duplicate- 查看副本,或者,如果不session.id,存在,则使用查找重复表单的用户
  • getDuplicate(仅限操作)- 获取副本并呈现重复页面

当我直接进入duplicate() 页面时发生错误。如果我先设置工作副本,则不会发生重定向问题。

以下是导致问题的控制器操作。

def setWorkingDuplicate(Integer id) {
    if (id && Duplicate.get(id)) {
        session.id = id
        flash.message = "Working Duplicate set to ID ${id}"
        redirect action: 'getDuplicate', params: [id: session.id]
    }
}

def duplicate() {
    if (session.id) {
        redirect(action: 'getDuplicate', params: [id: session.id])
        return
    }
    render view: 'duplicate'
}

def getDuplicate(Integer id) {
    def duplicate = Duplicate.get(id)

    if (!duplicate) {
        flash.message = "Duplicate not found with ID ${id}."
        render(view: 'duplicate')
        return
    }

    render view: 'duplicate', model: [duplicate: duplicate]
}

有谁知道这可能是什么原因造成的?

编辑:看起来堆栈跟踪中的某个地方我也收到以下错误。

Error Caused by: java.lang.StackOverflowError

WARN: Exception: java.lang.reflect.InvocationTargetException

在堆栈跟踪中,以下错误不断重复:

| Error     at edu.mssu.duplicates.InitialStepsController.render(InitialStepsController.groovy)
| Error     at edu.mssu.duplicates.InitialStepsController$render.callCurrent(Unknown Source)
| Error     at edu.mssu.duplicates.InitialStepsController.getDuplicate(InitialStepsController.groovy:69)
| Error     at edu.mssu.duplicates.InitialStepsController.getDuplicate(InitialStepsController.groovy)
| Error     at sun.reflect.GeneratedMethodAccessor382.invoke(Unknown Source)
| Error     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
| Error     at java.lang.reflect.Method.invoke(Method.java:601)
| Error     at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1259)
| Error     at org.apache.commons.beanutils.BeanMap.get(BeanMap.java:390)
| Error     at org.apache.commons.beanutils.BeanMap$12.next(BeanMap.java:565)
| Error     at org.apache.commons.collections.iterators.UnmodifiableIterator.next(UnmodifiableIterator.java:72)
| Error     at java.util.HashMap.putAll(HashMap.java:621)
| Error     at org.springframework.ui.ModelMap.addAllAttributes(ModelMap.java:117)
| Error     at org.springframework.web.servlet.ModelAndView.<init>(ModelAndView.java:97)
| Error     at org.codehaus.groovy.grails.web.metaclass.RenderDynamicMethod.renderView(RenderDynamicMethod.java:485)
| Error     at org.codehaus.groovy.grails.web.metaclass.RenderDynamicMethod.invoke(RenderDynamicMethod.java:187)
| Error     at org.codehaus.groovy.grails.plugins.web.api.ControllersApi.invokeRender(ControllersApi.java:258)
| Error     at org.codehaus.groovy.grails.plugins.web.api.ControllersApi.render(ControllersApi.java:246)

这是我的 Duplicate GSP 的一个(非常精简的)版本。GSP 提供了一种快速搜索/显示/更新副本并在一个页面中显示该副本的方法。因此,搜索框和显示形式。

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
</head>
<body>
    <h1>Duplicate</h1>
        <g:form action="duplicate" method="POST">
            <label for="id">Duplicate ID</label> <g:textField name="id" value="${duplicate?.id}" />

            <g:submitButton name="btnRetrieveDuplicate" value="Retrieve Duplicate" />
        </g:form>

        <g:if test="${duplicate}">
            <g:form action="updateDuplicate" method="POST">
                //Form stuff

                <g:hiddenField name="id" value="${duplicate?.id}" />
            </g:form>
        </g:if>
</body>
</html>
4

1 回答 1

2

在命名控制器与其他一些对象匹配或以“get”开头时,我遇到了一些非常奇怪的问题

尝试将:重命名
def getDuplicate(Integer id) 为完全不同的名称,例如:def myDupe(Integer id)

抱歉,我无法给您更好的解释,但我已经这样做了几次,只是为了让事情正常进行。

于 2013-09-18T21:46:49.643 回答