4

アプリケーションを grails 3.0.13 から grails 3.1.1 にアップグレードしました。そうすることで、JSON レンダリングで興味深い問題が発生しました。

カスタム JSON マーシャラーを使用しています。

JSON.registerObjectMarshaller(Appointment) { Appointment appointment ->
    [
        id: appointment.id,
        version: appointment.version,
        resourceChangeable: appointment.resourceChangeable,
        start: appointment.startTime.format("yyyy-MM-dd'T'HH:mm:ss"),
        end: appointment.endTime.format("yyyy-MM-dd'T'HH:mm:ss"),
        displayStartTime: appointment.displayStartTime,
        displayEndTime: appointment.displayEndTime,
        title: appointment.description,
        customerId: appointment.customerId,
        customerName: appointment.customer?.fullName,
        customerPhone: appointment.customer?.cellPhone,
        resourceId: appointment.resourceId,
        resourceName: appointment.resource?.name,
        editUrl: appointment.editUrl,
        updateUrl: appointment.updateUrl,
        errors: appointment.errors,
        eventBackgroundColor: appointment.resource?.backgroundColor,
        notes: appointment.notes
    ]
}

これを grails 3.1.1 で使用しようとすると、次のエラーが発生します。

No Datastore Session bound to thread, and configuration does not allow creation of non-transactional one here. Stacktrace follows:
org.grails.web.converters.exceptions.ConverterException: java.lang.IllegalStateException: No Datastore Session bound to thread, and configuration does not allow creation of non-transactional one here
    at grails.converters.JSON.value(JSON.java:184) ~[grails-plugin-converters-3.1.1.jar:3.1.1]
    at grails.converters.JSON.convertAnother(JSON.java:144) ~[grails-plugin-converters-3.1.1.jar:3.1.1]
    at grails.converters.JSON.value(JSON.java:184) ~[grails-plugin-converters-3.1.1.jar:3.1.1]
    at grails.converters.JSON.render(JSON.java:119) ~[grails-plugin-converters-3.1.1.jar:3.1.1]
    at grails.converters.JSON.render(JSON.java:132) ~[grails-plugin-converters-3.1.1.jar:3.1.1]
    at grails.artefact.controller.support.ResponseRenderer$Trait$Helper.render(ResponseRenderer.groovy:191) ~[grails-plugin-controllers-3.1.1.jar:3.1.1]
    at se.easycalendar.admin.CalendarController.getAppointments(CalendarController.groovy:39) ~[main/:na]
    at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.groovy:53) ~[spring-security-core-3.0.3.jar:na]
    at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.groovy:62) ~[spring-security-core-3.0.3.jar:na]
    at grails.plugin.springsecurity.web.SecurityRequestHolderFilter.doFilter(SecurityRequestHolderFilter.groovy:58) ~[spring-security-core-3.0.3.jar:na]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_72]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_72]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_72]
Caused by: java.lang.IllegalStateException: No Datastore Session bound to thread, and configuration does not allow creation of non-transactional one here
    at BootStrap$_closure1$_closure3.doCall(BootStrap.groovy:30) ~[main/:na]
    ... 13 common frames omitted

そして、予定.リソース?.名前行で発生します。これを回避するさまざまな方法を試し、1 つのユースケースの回避策に成功しましたが、別の場所で同じエラーが発生しています。これをどこでも変更するのは、間違った方法のように思えます。

私のドメイン クラスでは、次のような関係を宣言しました。

class Appointment {
    String uuid = UUID.randomUUID().toString()
    Date startTime
    Date endTime
    String description
    String notes
    Boolean resourceChangeable = true

    Date dateCreated
    Date lastUpdated

    static belongsTo = [resource: Resource, customer: Customer, serviceEntityResource: ServiceEntityResource, sms: Sms]

    static constraints = {
        customer nullable: true
        uuid maxSize: 40
        serviceEntityResource nullable: true
        description maxSize: 100
        notes maxSize: 500, nullable: true, blank: true
        sms nullable: true
    }

    static mapping = {
        startTime index: 'appointment_start_time_idx'
        sms cascade: 'none'
        sort "startTime"
        customer fetch: 'join'
        resource fetch: 'join'
     }
}

リソースと顧客フィールドを熱心にロードする必要があると思いましたか? (私は以前、grails 3.0.14 ユーザー "customer lazy: false" で動作しました。

ただし、現在は機能しません。gorm 5 でのセッションの動作に変更はありましたか? json レンダリングでリレーションを引き続き使用できるようにするには、どうすればよいですか?

4

1 に答える 1

2

ここで自分の質問に対する答えを見つけ、他の誰かが同じ問題を抱えている場合に備えて、結果を投稿する必要があると考えました。

この問題は、JSON マーシャラーが原因でした。私は以下を使用していました:

JSON.registerObjectMarshaller(Appointment) { Appointment appointment ->
    [
    id: appointment.id,
    version: appointment.version,
    resourceChangeable: appointment.resourceChangeable,
    start: appointment.startTime.format("yyyy-MM-dd'T'HH:mm:ss"),
    end: appointment.endTime.format("yyyy-MM-dd'T'HH:mm:ss"),
    displayStartTime: appointment.displayStartTime,
    displayEndTime: appointment.displayEndTime,
    title: appointment.description,
    customerId: appointment.customerId,
    customerName: appointment.customer?.fullName,
    customerPhone: appointment.customer?.cellPhone,
    resourceId: appointment.resourceId,
    resourceName: appointment.resource?.name,
    editUrl: appointment.editUrl,
    updateUrl: appointment.updateUrl,
    errors: appointment.errors,
    eventBackgroundColor: appointment.resource?.backgroundColor,
    notes: appointment.notes
    ]
}

問題は次の行にあります。

customerId: appointment.customerId,
resourceId: appointment.resourceId,

grails 3.0.x では正常に動作しましたが、grails 3.1.x では動作しなかったのは、おそらく gorm 5 への切り替えのせいでしょうか? とにかく、私がに変更したとき:

customerId: appointment.customer?.id,
resourceId: appointment.resource?.id,

すべてがうまくいきました!customerId および resourceId プロパティ (予定自体に保存されている) を使用できないのは少し奇妙だと思います。問題は、他のドメイン オブジェクトのモデルにアクセスする他の行にあると考えましたが、そうではありませんでした。

于 2016-03-16T14:20:12.870 に答える