Question

Le script Grails suivant:

// Import.groovy

includeTargets << grailsScript("Bootstrap")

target(main: "Import some data...") {
    depends(bootstrap)

    def Channel = grailsApp.classLoader.loadClass("content.Channel")

    def c 

    // works: saving a valid Channel succeeds
    c = Channel.newInstance(title:"A Channel", slug:"a-channel", position:0).validate()

    // doesn't work: saving an invalid Channel fails with exception
    c = Channel.newInstance().validate()

    // this line is never reached due to exception
    println(c.errors)

}

setDefaultTarget(main) 

échoue à l'exception:

  

Erreur exécution du script d'importation: org.hibernate.HibernateException: pas de Session lié à fil et la configuration ne permet pas la création d'un non transactionnel ici

quand validate () est appelée sur un objet de domaine non valide. Je voudrais transmettre les messages d'erreur lors de la validation échoue, mais il semble que je vais devoir établir une session de mise en veille prolongée afin de le faire. Quelqu'un connait un moyen de passer cela?

Était-ce utile?

La solution

Trouvé RunScript.groovy qui met en place la session de mise en veille prolongée pour vous, puis exécute les scripts que vous spécifiez comme arguments. Je devais changer ma source d'un script Gant (ci-dessus) simplement:

// Import.groovy

def Channel = grailsApp.classLoader.loadClass("content.Channel")

def c 
c = Channel.newInstance(title:"A Channel", slug:"a-channel", position:0).validate()
c = Channel.newInstance().validate()
println(c.errors)

Je suis capable de l'exécuter comme ceci:

  

$> Grails scripts script run / Import.groovy

Autres conseils

Je suis en train de faire quelque chose comme ça et ça fonctionne pour moi ...

// Import.groovy

includeTargets << grailsScript("Bootstrap")

target(main: "Import some data...") {
    depends(bootstrap)

    // added this ------------------------------------------------------
    def sessionFactory = appCtx.getBean("sessionFactory")
    def session = SessionFactoryUtils.getSession(sessionFactory, true)
    TransactionSynchronizationManager.bindResource(
        sessionFactory, new SessionHolder(session))
    // added this ------------------------------------------------------

    def Channel = grailsApp.classLoader.loadClass("content.Channel")

    def c 

    // works: saving a valid Channel succeeds
    c = Channel.newInstance(title:"A Channel", slug:"a-channel", position:0).validate()

    // doesn't work: saving an invalid Channel fails with exception
    c = Channel.newInstance().validate()

    // this line is never reached due to exception
    println(c.errors)

}

setDefaultTarget(main)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top