4

我有一些代码试图从 Grails 1.3.7 移植到 Grails 2.2。

当前的问题是我有一个BaseController类,它定义了一些便利方法,以及从它继承的特定控制器(实际上由 Grails 实例化的控制器)。

package com.fxpal.querium

import grails.converters.JSON
import groovy.lang.Closure;

abstract class BaseController {

    protected def executeSafely(Closure c) {
        def resp = null
        try { 
            populateContext();
            resp = c() 
        }
        catch(Exception ex) {
            resp = [error: ex.message]
            ex.printStackTrace()
        }
        def json = resp as JSON
        return json
    }

    protected void populateContext() {

    }
}

派生类的一个例子是

package com.fxpal.querium

import grails.converters.JSON
import grails.plugins.springsecurity.Secured
import javax.servlet.http.HttpServletResponse

@Secured(['IS_AUTHENTICATED_REMEMBERED'])
class DocumentController extends BaseController {

    def grailsApplication

    @Secured(['IS_AUTHENTICATED_ANONYMOUSLY'])
    def getText = {
        try {
            String text = new URL(grailsApplication.config.querium.docurl + params.paperId).text
            render contentType: 'text/plain', text: text            
        }
        catch(Exception ex) {
            render contentType: 'text/plain', text: "Error loading document: ${ex.getMessage()}; please retry"
        }
    }

...
}

这在 Grails 1.3.7 中有效。当我尝试使用 Grails 2.2 编译我的应用程序时,我收到以下错误:

C:\code\querium\AppServer-grails-2\grails-app\controllers\com\fxpal\querium\DocumentController.groovy: -1: The return ty
pe of java.lang.Object getGrailsApplication() in com.fxpal.querium.DocumentController is incompatible with org.codehaus.
groovy.grails.commons.GrailsApplication getGrailsApplication() in com.fxpal.querium.BaseController
. At [-1:-1]  @ line -1, column -1.

是否不再支持此模式?我尝试添加abstract声明BaseController(在 Grails 1.3.7 中没有必要),但这似乎没有任何区别。如果这很重要,我在清理后编译了我的代码。

PS:对于那些可以:请创建一个grails-2.2标签

4

1 回答 1

13

删除def grailsApplication- 该字段已通过 AST 转换作为类型化字段 ( GrailsApplication) 添加到类字节码中,因此您的def字段创建第二个具有较弱类型 ( Object) 的 get/set 对。

于 2012-12-25T11:22:44.723 回答