Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use lambda expressions inside TextField expression in Jaspersoft Studio 6.3

I want to use lambda expressions inside a TextField expression like this:

Arrays.asList($F{field1}, $F{field2}, $F{field3}).stream().filter(i -> i != null).collect(java.util.stream.Collectors.joining(" / "))

Assuming this values for the fields:

$F{field1} = 1
$F{field2} = null
$F{field3} = 2

The expected result is of the TextField evaluation is:

1 / 2

Instead of I'm getting an error in the IDE:

Lambda expressions are allowed only at source level 1.8 or above

And this is the exception inside the IDE during the compile:

net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file:
1. Lambda expressions are allowed only at source level 1.8 or above
                value = "Contato: " + Arrays.asList(((java.lang.String)field_c_telefone.getValue()), ((java.lang.String)field_c_celular.getValue()), ((java.lang.String)field_c_fax.getValue()), ((java.lang.String)field_c_email.getValue())).stream().filter(i -> i != null).collect(java.util.stream.Collectors.joining(" / ")); //$JR_EXPR_ID=22$
                                                                                                                                                                                                                                                               <------------>
2. Lambda expressions are allowed only at source level 1.8 or above
                value = "Contato: " + Arrays.asList(((java.lang.String)field_c_telefone.getOldValue()), ((java.lang.String)field_c_celular.getOldValue()), ((java.lang.String)field_c_fax.getOldValue()), ((java.lang.String)field_c_email.getOldValue())).stream().filter(i -> i != null).collect(java.util.stream.Collectors.joining(" / ")); //$JR_EXPR_ID=22$
                                                                                                                                                                                                                                                                           <------------>
3. Lambda expressions are allowed only at source level 1.8 or above
                value = "Contato: " + Arrays.asList(((java.lang.String)field_c_telefone.getValue()), ((java.lang.String)field_c_celular.getValue()), ((java.lang.String)field_c_fax.getValue()), ((java.lang.String)field_c_email.getValue())).stream().filter(i -> i != null).collect(java.util.stream.Collectors.joining(" / ")); //$JR_EXPR_ID=22$
                                                                                                                                                                                                                                                               <------------>
3 errors
.

    at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:206)

    at net.sf.jasperreports.eclipse.builder.JasperReportCompiler.compileReport(JasperReportCompiler.java:294)

    at net.sf.jasperreports.eclipse.builder.JasperReportCompiler.compileReport(JasperReportCompiler.java:146)

    at net.sf.jasperreports.eclipse.builder.JasperReportsBuilder.compileJRXML(JasperReportsBuilder.java:220)

    at com.jaspersoft.studio.editor.action.CompileAction.actionCompile(CompileAction.java:142)

    at com.jaspersoft.studio.editor.action.CompileAction$1.run(CompileAction.java:93)

    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

I already changed my report project to use the JRE System 1.8, but the error continues.

How can I solve it? Does jasper compiler supports lambdas?

like image 431
Beto Neto Avatar asked Jan 12 '17 16:01

Beto Neto


People also ask

How do you write expressions in JasperReports?

JasperReports doesn't support if-else statements when defining variable expressions. Instead, you can use the ternary operators {cond} ? {statement 1} : {statement 2}. This operator can be nested inside a Java expression to obtain the desired output based on multiple conditions.

How do you add variables in Jaspersoft?

As with many other elements, all the defined variables are visible in the Outline menu under the item called "Variables". From there you can create a new variable (right click on the "Variables" item and then "Create variable") and, once selected, a variable its properties are visible on the Properties tab.

Where do I put JasperReports properties?

jasper. properties is looked up by jasper reports in the classpath, so it can be directly in the WEB-INF/classes folder, or in the root folder of any of the jars in WEB-INF/lib.

How do I add a field in Jaspersoft Studio?

To create a field, right-click the Fields node and select Create Field. The new field is included as an undefined entry on the Properties tab. You can configure the field properties by selecting it.


1 Answers

To enable Java 8 support try to add this 3 parameters to the Jaspersoft Studio.ini file (placed at \TIBCO\Jaspersoft Studio-6.x.final folder):

-Dorg.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-Dorg.eclipse.jdt.core.compiler.compliance=1.8
-Dorg.eclipse.jdt.core.compiler.source=1.8

My ini file looks like this (for Jaspersoft Studio 6.3.1 version):

-startup
plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.300.v20150602-1417
-data
@noDefault
--launcher.defaultAction
openFile
-vm
features/jre.win32.win32.x86_64.feature_1.8.0.u92/jre/bin
-vmargs
-Xms128m
-Xmx1024m
-XX:+CMSClassUnloadingEnabled
-XX:+UseConcMarkSweepGC
-Dfile.encoding=UTF-8
-Djava.net.preferIPv4Stack=true
-Dorg.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-Dorg.eclipse.jdt.core.compiler.compliance=1.8
-Dorg.eclipse.jdt.core.compiler.source=1.8

I checked this report and it compiled and worked well:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="java8support" pageWidth="595" pageHeight="842" whenNoDataType="NoDataSection" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <parameter name="p1" class="java.lang.String" isForPrompting="false">
            <defaultValueExpression><![CDATA["1"]]></defaultValueExpression>
    </parameter>
    <parameter name="p2" class="java.lang.String" isForPrompting="false">
            <defaultValueExpression><![CDATA["2"]]></defaultValueExpression>
    </parameter>
    <title>
        <band height="79" splitType="Stretch">
            <textField>
                <reportElement x="80" y="20" width="234" height="30"/>
                <textFieldExpression><![CDATA[Arrays.asList($P{p1}, $P{p2}).stream().filter(i -> i != null).collect(java.util.stream.Collectors.joining(" / "))]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

Compiling result:

Result of compiling in JSS

The generated result in JSS:

Preview in JSS

Remark

I got the same error (Lambda expressions are allowed only at source level 1.8 or above) without using this 3 parameters in JSS:

Error during compiling in JSS


More info how to compile templates from Java project in posts:

  • How to use lambda expression in jrxml file?
  • What version of JaspeReports has support for Java 8?
  • Does JDK 8 supports JasperReports 6?
like image 94
Alex K Avatar answered Nov 28 '22 03:11

Alex K