我面临以下疑问,涉及从JEE网络应用程序传递信息到ireport以填充jasper中的表格。
在Ireport中,当我从java bean创建数据源时,它向我询问一个静态方法,它将数据发送给jasper并使用它来完成表。但是,每次我尝试在state / statless / managed bean中实现静态函数并调用具有要在jasper中显示的Collection的类时它说“无法从静态上下文引用非静态变量XX”。
我知道它正在发生,因为我需要在静态方法中创建一个EJB实例并填充要返回的集合。但我不应该创建EJB实例,即使我可以,新实例也不会具有与当前EJB上下文相同的信息。
我还没有找到解决方法来解决这个问题。 你有任何推荐吗?
我正在使用JSF 2,java EJB,JPA和glassfish 3.1
谢谢,
答案 0 :(得分:2)
Jasper文档的理解并不那么简单,大多数时候它可能会让您感到困惑。 我所做的是在我通过bean注入发送到报告的类中创建一个额外的JRBeanCollectionDataSource属性。 这个新属性让我发送一个Collection(一个列表),在jasper报告中,我在表中声明了一个数据源,该值是我之前提到的bean的属性。
<jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
<datasetRun subDataset="DosCoulmnas" uuid="1364a3ee-d385-49a0-9d12-e5bdd95832ac">
<datasetParameter name="encabezados">
<datasetParameterExpression><![CDATA[$F{dtoPDFAreaYGrado1.dtoEstablecimiento}.getEncabezados()]]></datasetParameterExpression>
</datasetParameter>
<dataSourceExpression><![CDATA[$F{dtoPDFAreaYGrado1.dtoEstablecimiento}.getDatos()]]></dataSourceExpression>
</datasetRun>
答案 1 :(得分:1)
尝试使用bean注入,而不是静态方法,因此您可以引用bean的当前状态,并使用它的方法。