Domanda

Il seguente script graal:

// 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) 

non riesce ad eccezione:

  

Errore di script in esecuzione di importazione: org.hibernate.HibernateException: No Hibernate Session legato a filo, e la configurazione non permette la creazione di uno non transazionale qui

quando validate () viene chiamato su un oggetto di dominio non valido. Mi piacerebbe uscita i messaggi di errore quando la validazione fallisce, tuttavia sembra che avrò bisogno di stabilire una sessione di Hibernate al fine di farlo. Qualcuno sa un modo per superare questo?

È stato utile?

Soluzione

Trovato RunScript.groovy che imposta la sessione Hibernate per voi, allora esegue gli script specificati come argomenti. Ho dovuto cambiare la mia fonte da uno script di Gant (sopra) per semplicemente:

// 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)

Sono in grado di farlo funzionare in questo modo:

  

$> graal script run-script / Import.groovy

Altri suggerimenti

che sto facendo qualcosa di simile e funziona per me ...

// 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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top