2

Grails 3.1.11 から 3.2.0 への更新後、コントローラーの 1 つのアクションが機能しなくなっていることに気付きました。

@Transactional(readOnly = true)
class RoomPlanController {
    ...
    def show(RoomPlan roomPlan) {
        ...
    }
    def getRooms(RoomPlan roomPlan) {
        ...
    }
}

問題は、呼び出しroomPlan/getRooms/1 roomPlanが null であることです。同じパラメーターでアクションを呼び出すと、showroomPlan が正しく設定されます。

コントローラー内で を呼び出すとgetErrors()、次のエラー メッセージが表示されます。

現在の Hibernate セッションを取得できませんでした。ネストされた例外は org.hibernate.HibernateException: No Session found for current thread です

grails.artefact.Controller.initializeCommandObject に由来します。showさらにデバッグした後、 と の間のスタックトレースの違いに気付きましたgetRooms

のスタックトレースshow:

show:100, RoomPlanController (at.byte_code.businessSuite.hotel)
$tt__show:-1, RoomPlanController (at.byte_code.businessSuite.hotel)
doCall:-1, RoomPlanController$_show_closure13 (at.byte_code.businessSuite.hotel)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)

のスタックトレースgetRooms:

getRooms:109, RoomPlanController (at.byte_code.businessSuite.hotel)
getRooms:-1, RoomPlanController (at.byte_code.businessSuite.hotel)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)

エラーメッセージと異なるスタックトレースから、データベースのセッション/トランザクションに何らかの関係があり@Transactional(readOnly = true)、アクションに追加した後、grails 3.2.0 への更新前はすべてが期待どおりに機能していると推測できます。アノテーションを削除して再び失敗した場合。

他のコントローラーでは問題を確認できず、小規模なテスト プロジェクトで再現することもできませんでした。私たちはすでにプロジェクトを再構築しようとしましたが、そうではなかった完全に新しいワークステーションでも.

他の誰かがそのような問題を観察しましたか?

4

1 に答える 1

0

コントローラーに @Transactional(readOnly = true) さえ必要ないと思います。

Grails コントローラーはデフォルトで readOnly です。コントローラから注釈を削除するだけです。

対照的に、Grails サービス クラスはデフォルトでトランザクション対応です。save() メソッドを呼び出す必要がある場合は、サービス クラスでそのメソッドを呼び出す方が望ましいです。

于 2016-10-10T15:47:32.343 に答える