我正在使用 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>