2015-04-21 98 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域類。