如何防止Grails渲染默认视图?

如何防止Grails渲染默认视图?,grails,Grails,我正在使用Grails1.2.1。我的控制器中有此方法 class SocialMediaCacheProxyController { def index = { def url = params.url if (params.dumpAll != null) { transportCacheService.processCacheDump(request.getRemoteAddr(), response)

我正在使用Grails1.2.1。我的控制器中有此方法

class SocialMediaCacheProxyController {

    def index = {       
        def url = params.url
        if (params.dumpAll != null) {
            transportCacheService.processCacheDump(request.getRemoteAddr(), response)
        } else if (url != null) {
            doCacheTransport(request, response)
        }   // if
    }
问题是,两个执行路径都将内容写入响应。但是,我认为Grails正在尝试在index方法的末尾呈现页面,因为在调用此方法后,我反复出现以下错误

1339754 [http-8080-4] ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/socialmediaproxy].[default]  - Servlet.service() for servlet default threw exception
java.lang.IllegalStateException: response.getWriter() called after response.getOutputStream()
    at org.codehaus.groovy.grails.web.sitemesh.GrailsPageResponseWrapper$GrailsBuffer.getWriter(GrailsPageResponseWrapper.java:284)
    at org.codehaus.groovy.grails.web.sitemesh.GrailsPageResponseWrapper$3.activateDestination(GrailsPageResponseWrapper.java:125)

在我的方法完成后,如何让Grails停止渲染任何东西?谢谢,-Dave

如果您不告诉Grails要渲染什么,它将根据约定进行渲染。在您的情况下,它正在寻找index.gsp。控制器必须返回某些内容。这就是重点。因此,您可以使用约定并创建返回的index.gsp,也可以手动实现render()方法


我认为您试图做一些与MVC应用程序设计相反的事情。控制器的存在是为了根据参数将您发送到某个地方。也许您可以通过AJAX调用来使用服务。或者,如果控制器操作正在更改要显示的数据,则可以重定向回调用所来自的页面。从这里开始:


我认为Grails可能会转发到index.gsp,因为默认情况下,当您不返回值时,它会这样做


因此,我认为您应该在索引结束时
返回null
,以向grails发出信号,表明您已经将所有想要的内容写入了输出流。

ModelAndView
一起工作的大多数控制器代码似乎都在关注
ServletResponse
是否有响应

我认为你可以在控制器动作结束时调用。这将导致响应标记为已提交,并且控制器不会返回ModelAndView

另一种方法是调用
response.outputStream.flush()
,这也会导致提交响应。这是我通常在手动处理响应(例如,文件下载)后结束的操作

注意:我不确定这属于“最佳实践”的范畴——通常您应该依赖容器来处理servlet流的刷新。这样做可能会产生不经意的副作用。您可能需要对其进行测试,看看您的应用程序和运行它的容器会发生什么情况。

试试这个 呈现(视图:“/页面名称”,模型:[文本:'hi there')


如果你想呈现一个模板而不是“查看”,你可以将“模板”

这些文档链接在你的链接之后过期,我尝试添加“呈现(文本:'hi there')”作为我的控制器索引方法的最后一行,但我仍然得到了相同的错误。请忽略前面的注释。您的建议有效--我的代码中还有另一个错误阻止了解决方案的工作。我对此进行了测试,当我返回
null
时,它仍试图呈现默认视图。但是,如果我更改了在
response
输出流中,返回null是有效的(尽管如果Grails只是查看响应的
isCommitted
状态,那么显式返回
null
可能是不必要的)。