在grails Job中执行脚本

时间:2015-04-21 15:52:11

标签: grails groovy

我正在研究一个程序的两个部分。一个创建小的groovy脚本,另一个在Job中执行它们。每个脚本用于将信息从地图转换为域对象。然后,作业将保存域对象以供将来使用。

这是一个小例子。

class Report {
    Date date
    Country country
}

地图

Map<String, String> map = new HashMap<String, String>();
map.put("date", "2015-04-21 11:31:11");
map.put("country", "United States");

日期脚本

String script = "x.date = Date.parse('y-M-d h:m:s', y['date'])"

目前使用Eval执行该脚本。

Eval(report, map, script)

还有其他更复杂的脚本需要查找信息并根据值做出决策。

日期脚本工作正常,但是当国家/地区脚本执行时,我收到错误。

国家/地区脚本

String script = "import app.Country\nx.country = Country.findByName(y['country'])"

错误

Script1.groovy: 1: unable to resolve class app.Country

似乎在调用Eval时没有加载Country类。如何在Eval中导入?我应该使用Eval还是GroovyShell?

1 个答案:

答案 0 :(得分:1)

您需要实例化一个GroovyShell作为参数传递grailsApplication类加载器,请参阅下面的示例:

<强> BootStrap.groovy中

    Map bindingValues = new HashMap()
    bindingValues.sessionFactory = sessionFactory
    bindingValues.propertyInstanceMap = propertyInstanceMap
    bindingValues.dataSource = dataSource
    bindingValues.ctx = grailsApplication.mainContext
    GroovyShell gs = new GroovyShell(grailsApplication.classLoader, new Binding(bindingValues))
    gs.evaluate new File("docs/CargaAvaliacoes.groovy")

<强> CargaAvaliacoes.groovy

    import avaliacao.Colaborador
    import modelo.ModeloAvaliacao
    import programa.Programa

    def programa = Programa.get(1)
    def modelo = ModeloAvaliacao.get(1)

    def avaliadores = ["02270789332":"1020016","11388449681":"1010002","02231772331":"1010004","04247774332":"1020002"]

    def avaliacaoService = ctx.getBean("avaliacaoService")

    avaliadores.each {
            def avaliador = Colaborador.findByCpf(it.key)
            def avaliados = Colaborador.findAllBySetorAndCpfNotEqual(it.value,it.key)

            avaliados.each {
                avaliacaoService.cadastrar(programa, modelo, avaliador, it)
            }
    }

**您需要指定grailsApplication.classLoader,因为此类加载器用于加载Grails域类。