4

Grails1.3.7からGrails2.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"
        }
    }

...
}

これはGrails1.3.7で機能しました。アプリをGrails2.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 変換を介してクラス バイトコードに既に追加されているため、フィールドはより弱い型 ( ) で 2 番目の get/set ペアを作成します。GrailsApplicationdefObject

于 2012-12-25T11:22:44.723 に答える