在JasperReport中,如果未指定数据源对象中的区域设置,则将java.lang.Long字段与JsonDataS



当我尝试使用JsonDataSource时,我遇到了前面提到的jasper报告问题。

我将我的报告数据构造成符合JSON的String,并使用它创建一个net.sf.jasperreports.engine.data.JsonDataSource对象,然后将其传递给Jasper fillReport-api:

jasperPrint = JasperFillManager.fillReport(getJasperTemplatePath(), criteria.getReportParams(), jsonDataSource);

在这里,我传递了JSON_LOCALE和其他一些参数,但不知何故,jasper无法编译报告,并抱怨使用java.lang.Long 的字段

Error filling print... Unable to get value for field 'total_clickthrough' of class 'java.lang.Long'
net.sf.jasperreports.engine.JRException: Unable to get value for field 'total_clickthrough' of class 'java.lang.Long'
  at net.sf.jasperreports.engine.data.JsonDataSource.getFieldValue(JsonDataSource.java:234)
  at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:1330)

经过调试,发现这是由于JsonDataSource对象中的locale字段为null造成的。它似乎不是从参数中得到的。因此,我也尝试直接将区域设置为数据源对象,这很好。

然后,我遇到了子报表的问题,在子报表中,我使用以下表达式根据父报表的字段为报表创建json数据源。

<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JsonDataSource(new java.io.ByteArrayInputStream($F{data}.toString().getBytes("UTF-8")))]]></dataSourceExpression>

在这里,它在数值方面也有同样的问题,我很确定这是由于区域设置的原因,但问题是我无法设置JsonDataSource区域设置,因为我在报表jrxml中使用表达式。

我能找到的所有与jsonDatasource相关的jasper示例都直接使用net.sf.jasperreports.json.source使用json文件,因此与这个问题不太相关。

有什么办法绕过这个吗?非常感谢您对此提供的任何帮助!

JsonDataSource是如何实例化的?

当我没有向数据源提供JSON选择表达式时,我也遇到了同样的错误(使用您的JSON片段)。

我在做这个:

JsonDataSource dataSource = new JsonDataSource(new ByteArrayInputStream(json.getBytes()));

并更改为:

JsonDataSource dataSource = new JsonDataSource(new ByteArrayInputStream(json.getBytes()), "report");

以下是比较的完整示例(如果您尝试,请更改路径):

Main.java

import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JsonDataSource;
public class Main {
    public static void main(String[] args) throws Exception {
        String json = "{ "report": { "total_clickthrough" : 1000, "total_pageview": 2000, "data": [ { "date": "2015-03-02", "clickthrough": 10 }] } }";
        JsonDataSource dataSource = new JsonDataSource(new ByteArrayInputStream(json.getBytes()), "report");
        JasperPrint print = JasperFillManager.fillReport(new FileInputStream("/path/to/report.jasper"), null, dataSource);
        byte[] pdf = JasperExportManager.exportReportToPdf(print);
        FileOutputStream fos = new FileOutputStream("/path/to/report.pdf");
        fos.write(pdf);
        fos.close();
    }
}

report.jrxml:

<?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="report" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="63a7bd83-eee8-41a6-8cbc-bc1ba1b44f1f">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="30"/>
    <queryString language="JSON">
        <![CDATA[report]]>
    </queryString>
    <field name="total_clickthrough" class="java.lang.Long">
        <fieldDescription><![CDATA[total_clickthrough]]></fieldDescription>
    </field>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band height="79" splitType="Stretch"/>
    </title>
    <pageHeader>
        <band height="35" splitType="Stretch"/>
    </pageHeader>
    <columnHeader>
        <band height="61" splitType="Stretch">
            <staticText>
                <reportElement x="217" y="2" width="100" height="20" uuid="d03246a7-80ac-4d52-ab12-c988bf68afc1"/>
                <text><![CDATA[total_clickthrough]]></text>
            </staticText>
        </band>
    </columnHeader>
    <detail>
        <band height="125" splitType="Stretch">
            <textField>
                <reportElement x="217" y="42" width="100" height="20" uuid="8d58ea82-ba52-46f1-9053-173ffcb100b1"/>
                <textFieldExpression><![CDATA[$F{total_clickthrough}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
    <columnFooter>
        <band height="45" splitType="Stretch"/>
    </columnFooter>
    <pageFooter>
        <band height="54" splitType="Stretch"/>
    </pageFooter>
    <summary>
        <band height="42" splitType="Stretch"/>
    </summary>
</jasperReport>

最新更新