I have the report where one field is
<field name="Gender" class="java.lang.Object">
<fieldDescription><![CDATA[gender]]></fieldDescription>
</field>
The gender is an enum field
public enum Gender {
MALE, FEMALE
}
In the report detail band I wanna display the gender
<textField isStretchWithOverflow="true" isBlankWhenNull="true">
<reportElement style="Detail" x="6716" y="0" width="144" height="29"/>
<textElement verticalAlignment="Middle" lineSpacing="Single"/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{Gender}]]></textFieldExpression>
</textField>
but that textField shows only either enum.male.MALE or enum.female.FEMALE. How can I display text MALE or FEMALE only depends on the Gender value?
When modifying the textField code to the following:
<textField isStretchWithOverflow="true" isBlankWhenNull="true">
<reportElement style="Detail" x="6716" y="0" width="144" height="29"/>
<textElement verticalAlignment="Middle" lineSpacing="Single"/>
<textFieldExpression class="java.lang.String"><![CDATA[($F{Gender} == enum.male.MALE) ? "Male" :
(($F{Gender} == enum.female.FEMALE) ? "Female" :
"No gender")]]></textFieldExpression>
</textField>
I get the following errors:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jasperViewResolver' defined in class path resource [spring/webmvc-config.xml]: Invocation of init method failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myreport' defined in ServletContext resource [/WEB-INF/reports/reportviews.xml]: Initialization of bean failed; nested exception is org.springframework.context.ApplicationContextException: Could not parse JasperReports report from ServletContext resource [/WEB-INF/reports/OL001_Opiskelijalista.jrxml]; nested exception is net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file:
1. Syntax error on token "enum", invalid Expression
value = (java.lang.String)((((java.lang.Object)field_Gender.getValue()) == enum.male.MALE) ? "Male" : //$JR_EXPR_ID=120$
<-->
2. Syntax error on token "enum", invalid Expression
((((java.lang.Object)field_Gender.getValue()) == enum.female.FEMALE) ? "Female" : //$JR_EXPR_ID=120$
<-->
3. Syntax error on token "enum", invalid Expression
value = (java.lang.String)((((java.lang.Object)field_Gender.getOldValue()) == enum.male.MALE) ? "Male" : //$JR_EXPR_ID=120$
<-->
4. Syntax error on token "enum", invalid Expression
((((java.lang.Object)field_Gender.getOldValue()) == enum.female.FEMALE) ? "Female" : //$JR_EXPR_ID=120$
<-->
5. Syntax error on token "enum", invalid Expression
value = (java.lang.String)((((java.lang.Object)field_Gender.getValue()) == enum.male.MALE) ? "Male" : //$JR_EXPR_ID=120$
<-->
6. Syntax error on token "enum", invalid Expression
((((java.lang.Object)field_Gender.getValue()) == enum.female.FEMALE) ? "Female" : //$JR_EXPR_ID=120$
<-->
6 errors
Since an enum is no text type, you have to check the enum and print out string values.
One way to do this by using this expression in the text field:
($F{Gender}.getClass().getName().equals("enum.male.MALE") ? "Male" :
(($F{Gender}.getClass().getName().equals("enum.male.FEMALE")) ? "Female" :
"No gender")
With this statement you can map the enum to some arbitrary string value.