我正在使用Grails 2.2.3应用程序清除数据库中的重复人员。当我尝试访问 Controller 操作时,出现以下错误: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.
这看起来像是一个无限重定向循环,因为一旦我转到duplicate()
操作,控制台中的Stacktrace就变得更加笨拙了。它一直打印,直到我从控制台退出Ctrl+C
为止。另外,有多个屏幕可用于处理和修复重复项,这就是为什么我提供了一种存储“工作”重复项的方法的原因。
Controller Action :
setWorkingDuplicate
-设置要在每个页面上使用的重复项(因此用户不必一直输入它)。 duplicate
-查看重复项,或者,如果不存在session.id,
,则用户以getDuplicate
(仅操作)-获取重复并呈现重复页面当我直接转到plicate()页面时发生错误。如果我首先设置工作副本,则不会发生重定向问题。
这是引起问题的 Controller 操作。
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)
这是我的重复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>
最佳答案
在命名 Controller 与其他对象匹配或以“get”开头时,我遇到了一些非常奇怪的问题
尝试重命名:
def getDuplicate(Integer id)
变成完全不同的东西:def myDupe(Integer id)
抱歉,我无法为您提供更好的解释,但是为了使事情正常进行,我已经做了几次。
关于grails - 呈现与 Action 同名的 View 时,Grails重定向循环错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18882665/