2015-04-21 63 views
0

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

这是一个小例子。

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'])" 

目前正在执行的脚本USI ng 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中进行导入?我应该使用Eval还是GroovyShell?

回答

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域类。