[英]How to use jasperreports subreports with grails jasper plugin?
我想将子报表与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:在插件[jasper]中执行控制器[JasperController]的操作[index]导致异常:net.sf.jasperreports.engine.fill.JRExpressionEvalException:错误评估表达式:源文本:新的net.sf.jasperreports.engine.data .JRBeanCollectionDataSource($ F {books})
异常消息:无法延迟初始化角色集合:bookshelf.Library.books,没有会话或会话被关闭
谢谢你的帮助。
Jasper报告只需要对象列表。 它不理解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
并将列表传递给Jasper Controller
(chain(controller:'jasper',action:'index',model:[data:data],params:params).
我有一个* .jasper(数据源XML。我使用了iReport)。 如何传递它(作为XML的书)?
预先感谢
我发现问题:
在我的图书馆域中,我只添加了一个带有“ 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”,我们提取域类的所有其他实例。
还有另一种方法可以解决此问题?
您可以使用jasper报告来调用gorm,但是您需要将报告的语言设置为常规而不是Java,因为它是默认语言。 然后,如果您使用子报表,则需要禁用jasper报表多线程并添加其他jar。 完美地工作了。
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(不必急于获取)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.