JasperReport / SubReport not displayed

We are using the open source framework JasperReports to creating PDF reports.

One of my Team members wanted to create a MasterReport with a SubReport. The SubReport was nothing special, it included just static Text.The problem was, that the subreport was not rendered, it was always empty.

The problem was that the subreport need to have a data connection. Even you don’t need one. The solution is to include a empty DataSource like this:

<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource()]]></dataSourceExpression>

The sub report definition in the master report looks like this:

<subreport>
 <reportElement x="0" y="246" width="504" height="100"/>
 <subreportParameter name="nameLabel"/>
 <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource()]]></dataSourceExpression>
 <subreportExpression><![CDATA[$P{SUBREPORT_DIR}]]></subreportExpression>
 </subreport>

JasperReports 3.5.3 + Spring 3.0.0.RELEASE

This maven2 archetype contains a little sample application with the new Spring 3.0.0.RELEASE Framework and JasperReports 3.5.3. The configuration is xml-driven. It is deployed on the PLOIN Repository-Server on

http://www.ploin-m2.de/nexus/content/groups/public/

you can create a project from the archetype with the following command:

mvn archetype:generate  -DarchetypeGroupId=org.ploin.archetype  -DarchetypeArtifactId=tempSpringJasperReports -DarchetypeVersion=1.0  -DarchetypeRepository=http://www.ploin-m2.de/nexus/content/groups/public/  -DgroupId=org.ploin -DartifactId=demoSpringJasperReport

The created project is a web-application with a simple servlet-filter. On the start site you can choose to create a pdf ord excel file.

JasperReports, strech with overflow

In JasperReports hat man oft das Problem das Texte einfach abgeschnitten werden. Wenn ein Textfeld nicht hoch oder breit genug ist, wird abgeschnitten. Das ist das standardverhalten vom Framework.
Wenn sich das Feld dem Textinhalt dynamisch anpassen soll muss das Attribut “stretch with overflow” den Wert “true” haben. In dem grafischen Editor iReport muss man dazu ein Rechtsklick auf das entsprechende Textfeld machen und im Kontextmenue den Eintrag “Properties” auswaehlen. In dem Popup-Fenster der dannach erscheint kann im Karteireiter ganz rechts (“All”) das Attribut gesetzt werden.

Sehr wichtig und weniger intuitiv dabei ist es, das Attribut “stretch type” auf dem Wert “no stretch” zu lassen. Wenn ein anderer stretch type eingestellt ist dann funktioniert das ganze bereits nicht mehr und auf diesen Fehler muss man erstmal kommen 🙂

Das entsprechende Stueck Sourcecode in der *.jrxml Datei dazu sieht wie folgt aus:

<textField isStretchWithOverflow="true"  isBlankWhenNull="false"  evaluationTime="Now"  hyperlinkType="None"   hyperlinkTarget="Self"  >
     <reportElement
            x="138"
            y="112"
            width="386"
            height="14"
            key="textField-12"
            positionType="Float" />
     <box topBorder="None"  topBorderColor="#000000"  leftBorder="None"  leftBorderColor="#000000"  rightBorder="None"  rightBorderColor="#000000"  bottomBorder="None"  bottomBorderColor="#000000" />
     <textElement>
            <font/>
     </textElement>
     <textFieldExpression class="java.lang.String" ><![CDATA[$F{descriptionValue}]]></textFieldExpression>
</textField>

Wenn alles richtig eingestellt ist, kann beliebig viel Text in ein Textfeld eingefuegt werden und dieser wird sogar vollstaendig angezeigt. Alle Element die unter dem Textfeld stehen werden natuerlich dementsprechend nach unten verschoben.

JasperReports, NoClassDefFoundError: org/apache/commons/javaflow/bytecode/Continuable

Neulich habe ich mir JasperReports 2.0.4 und iReport 2.0.4 runtergeladen. Ich habe mir mit iReport einen Report zusammengeklickt und aus iReport heraus den Report compiliert. Nachdem ich die compilierte Datei in mein Eclipse-Projekt kopiert habe und diese in meinem Programm verwenden wollte, erhielt ich die folgende Exception.

java.lang.NoClassDefFoundError: org/apache/commons/javaflow/bytecode/Continuable
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:675)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1817)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601)
at org.apache.struts2.views.jasperreports.JasperReportsResult.doExecute(JasperReportsResult.java:240)
at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:178)
at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:348)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:253)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:504)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:613)

Der Fehler kann sehr leicht behoben werden. iReport 2.0.4 benutzt die Bibliothek commons-javaflow-20060411.jar. Nachdem ich diese Jar-File zu meinen Bibliotheken hinzugefuegt habe, trat der Fehler nicht mehr auf.