在 grails 作业中执行脚本

Executing scripts in a grails Job

我正在处理一个程序的两个部分。一个创建小型 groovy 脚本,另一个在作业中执行它们。每个脚本用于将信息从映射转换为域对象。然后作业将保存域对象以备将来使用。

这是一个小例子。

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

似乎国家 class 没有在调用 Eval 时加载。如何在 Eval 中进行导入?我应该使用 Eval 还是 GroovyShell?

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

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 因为这个 class 加载程序用于加载 Grails 域 classes.