Java – Calling Java API in the iReport expression

ireportjasper-reportsjava

I'm trying to attach a call to a Java library into the iReport expression.

I tried this with a very simple library returning a hello world string.

package utils;
public class Hello {
    public static String hello()
    {
        return "Hello";
    }
}

Within iReport, i want to use this API. I compiled the above library into a jar file. Added the location in Tools -> Options -> Classpath.

then tried the following:

  • Editing the expression in a a text field new utils.Hello().hello()
  • Creating a new field and setting its type to utils.Hello. Then using the field.hello() in the expression

In both cases, it complains that it cannot resolve hello. However its in the classpath. I've also tried to right click on the report root and add utils.Hello/utils to the Java import directive. Neither of which seemed to pick up the class.

Any advice is greatly appreciated.

Best Answer

Your right expression might be like this:

<textFieldExpression><![CDATA[utils.Hello.hello()]]></textFieldExpression>

The working sample:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport ..>
    <queryString>
        <![CDATA[SELECT DISTINCT city FROM address ORDER BY city]]>
    </queryString>
    <field name="CITY" class="java.lang.String"/>
    <detail>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{CITY}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="100" y="0" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[utils.Hello.hello()]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

You can also add import instruction to the report. In this case the expression will be:

<textFieldExpression><![CDATA[Hello.hello()]]></textFieldExpression>

The working sample:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport ... whenNoDataType="AllSectionsNoDetail">
    <import value="utils.Hello"/>
    <title>
        <band height="41">
            <textField>
                <reportElement x="188" y="11" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[Hello.hello()]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

Note: For both samples the jar file (with utils.Hello class) must be in classpath.

Setting classpath in iReport

More info about using srciptlets you can find here.