【问题标题】:Executing scripts in a grails Job在 grails 作业中执行脚本
【发布时间】:2015-04-21 15:52:10
【问题描述】:

我正在研究一个程序的两个部分。一个创建小型 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?

【问题讨论】:

    标签: grails groovy


    【解决方案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 域类。

    【讨论】:

      猜你喜欢
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多