Плагин Jasper в Grails: org.hibernate.LazyInitializationException: не удалось инициализировать прокси - нет сеанса

Я пытаюсь создать отчет в формате документа с помощью плагина jasper, исключение генерируется по адресу:

JasperReportDef report = jasperService.buildReportDefinition(params, request.getLocale(), result) 

строка в моем контроллере

Исключение:

could not initialize proxy - no Session. Stacktrace follows:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at   org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:2170)
at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1332)
at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:770)
at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:846)
at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:426)
at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:111)
at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getFieldValue(JRAbstractBeanDataSource.java:96)
at net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.getFieldValue(JRBeanCollectionDataSource.java:100)
at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:1317)
at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1218)
at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1194)
at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1544)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:142)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:909)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:841)
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:88)
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:653)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:969)
at com.cvsurgeon.DownloadCVController$_closure3.doCall(DownloadCVController.groovy:563)
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
at java.lang.Thread.run(Thread.java:662)

Я погуглил и нашел альтернативу, но не работает в моем случае, например: 7304156#7304156">Как использовать подотчеты jasperreports с подключаемым модулем Grails jasper?

любая помощь будет оценена.


person Abs    schedule 23.04.2014    source источник


Ответы (1)


ИМХО проблема в том, что вы заполняете отчет данными, которые состоят из объектов предметной области.

Некоторые свойства этих объектов домена загружаются отложенно во время создания отчета, но сеанс недоступен, поэтому возникает ошибка.

Я вижу три возможных решения:

  1. Выполните вызов jasperService.buildReportDefinition в сервисе вместо контроллера — там должен быть доступен сеанс.

  2. Вместо того, чтобы использовать объекты домена для заполнения отчета, скопируйте необходимые данные в DTO и используйте его.

  3. Определите, какие свойства загружаются лениво, и сделайте их загрузкой с нетерпением — см. http://grails.org/doc/latest/guide/GORM.html#fetching

person lukelazarovic    schedule 24.04.2014