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