Как использовать подотчеты jasperreports с плагином Grails Jasper? - PullRequest
1 голос
/ 28 апреля 2010

Я хотел бы использовать подотчеты с плагинами Grails Jasper, я следовал инструкции по этому URL (http://www.grails.org/plugin/jasper). Вот мой код:

Доменная книга:

class Book {

  static belongsTo = Library

    Library library

    String title
    String author
    String publisher
    String category

    static constraints={
        title()
        author()
        publisher()
        category()
    }
}

Библиотека домена:

class Library {

  static hasMany = [ books : Book ]

  String name
  String adresse
  Date dateMaturity

    static constraints = {
    }

        String toString()
    {
        return name
    }
}

В моем BookController у меня есть:

def createReport = {
    def books = Book.list()
    chain(controller:'jasper',action:'index',model:[data:books],params:params)
}

В моем LibraryController у меня есть:

def createReport = {
    def library = Library.list()
    chain(controller:'jasper',action:'index',model:[data:library],params:params)
}

Моя часть яшмы:

У меня есть файл SubReport: books.jasper (получить список книг).
Также MasterReport: library.jasper (получить список библиотек).

В своем MasterReport (библиотеке) я добавил подотчет, и для каждой библиотеки я хотел бы показать список книг, которые он содержит; вот код моей библиотеки:

<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
...
<field name="books" class="java.util.Collection"/>
...
<subreport isUsingCache="true">
<reportElement x="0" y="25" width="437" height="100"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{books})]]></dataSourceExpression>
<subreportExpression class="java.lang.String"><![CDATA[$P{SUBREPORT_DIR} + "books.jasper"]]>
</subreportExpression>
</subreport>

И у меня есть эта ошибка:

Ошибка 500: Выполнение действия [index] контроллера [JasperController] в плагине [jasper] вызвало исключение: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Ошибка оценки выражения: Исходный текст: новый net.sf.jasperreports.engine.data.JRBeanCollectionDataSource ($ F {} книги)
Сообщение об исключении: не удалось лениво инициализировать коллекцию ролей: bookshelf.Library.books, ни один сеанс или сеанс не был закрыт

Спасибо за помощь.

Ответы [ 5 ]

1 голос
/ 30 апреля 2010

Джаспер сообщает, что ожидает список объектов. Он не понимает запросы GORM. Таким образом, мы создаем отдельный список объектов, который мы называем «Просмотр объектов», а затем отправляем их в отчеты Jasper вместо классов домена.

 class LibraryVO {
   List books
   String name
   String adresse
   Date dateMaturity
  }

 class bookVO {
  String title
    String author
    String publisher
    String category
  }

Вы можете инициализировать список как

 List data=[]

 LibraryVo libVo= new LibraryVO(...) // inalise it here
 libVo.books = [new BookVO(),new BookVO()]

 data << libVO

И передать список контроллеру Джаспера

(chain(controller:'jasper',action:'index',model:[data:data],params:params).
0 голосов
/ 23 марта 2015

Вы можете использовать отчет jasper для вызова вашего gorm, но вам нужно установить язык для отчета на groovy , а не java, как это по умолчанию. Затем, если вы используете подотчеты, вам нужно отключить многопоточность отчета jasper и добавить дополнительные jar-файлы. Это просто отлично работает.

0 голосов
/ 29 апреля 2014

У меня есть * .jasper (DataSource XML. Я использовал iReport). Как это можно передать (книга как XML) ??

Заранее спасибо

0 голосов
/ 05 сентября 2011

Исключение LazyInitializationException связано с тем, что объекты в testModel не привязаны к текущему сеансу гибернации.Я только что обошел это, взломав JasperController следующим образом:

class JasperController {
    JasperService jasperService

    // We need this to access the current hibernate session
    def sessionFactory

    def index = {
        println(params)

        def testModel = this.getProperties().containsKey('chainModel') ? chainModel : null

        // Re-attach model objects to avoid LazyInitializationException.
        def session = sessionFactory.getCurrentSession()
        testModel?.data?.each
        {
            session.update(it)
        }

        JasperReportDef report = jasperService.buildReportDefinition(params,            request.getLocale(), testModel)
        generateResponse(report)
    }

... и так далее.Это повторно присоединяет объекты модели, избегая LIE (без необходимости активно извлекать)

0 голосов
/ 29 апреля 2010

Я нахожу проблему:

В моем домене библиотеки я просто добавляю сопоставление с "books lazy: false":

class Library {

  static hasMany = [ books : Book ]

  String name
  String adresse
  Date dateMaturity

    static constraints = {
    }

    static mapping = {
    books lazy: false
  }

        String toString()
    {
        return name
    }
}

А теперь у меня есть отчет о проблемах!


Плагин Grails Jasper использует цепочку, чтобы связать модель от одного действия к следующему (chain(controller:'jasper',action:'index',model:[data:library],params:params).

После, в контроллере jasper мы получаем модель по этой строке:

def testModel = this.getProperties().containsKey('chainModel')?chainModel:null

По какой-то причине в коллекции библиотек возникла ошибка в списке книг, например: org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию - ни один сеанс или сеанс не был закрыт

Используя "lazy: false", мы извлекаем все остальные экземпляры класса домена.

Есть ли другой способ исправить эту проблему?

...