具有从JSP页面传递的多个值的BIRT报告参数

时间:2015-01-14 09:34:35

标签: java eclipse excel birt

我已经在Web应用程序中集成了BIRT。我正在使用Eclipse Luna,JDK 1.8,BIRT Report Engine 4.1.1和我使用的数据源是Excel数据源(不是JDBC和所有这些) 。在我的JSP页面中,我使用Javascript AJAX在URL中传递两个参数:`

var reporturl ="/Reporting/loadReport?ReportName="+reportName+"&ReportFormat=html&Supplier=Supplier4&Metal=Gold&Metal=Tin";     

    $("#reportData").html("Loading...<br><img src='/Reporting/resources/images/loading.gif' align='middle' >");

    $('#reportData').load(reporturl ,function(response, status, xhr) {

      if (status == "error") {
        var msg = "Sorry but there was an error getting details ! ";
        $("#reportData").html(msg + xhr.status + " " + xhr.statusText);
      }
    });

对于报告参数&#34; Metal&#34;我选择了显示类型:列表框,数据类型:字符串并选择了动态值,然后选中了“#34;允许多个值&#34;复选框。然后在表的属性编辑器中,在Filters选项卡中,我给出了如下表达式:

row["Supplier Name"] Equal to params["Supplier"].value
row["Metal"] In params["Metal"].value

在我的ReportRenderer.java中切换到JavaEE透视图后,我有以下代码来获取与&#34; Metal&#34;相关联的多个值。参数(从URL传递),我已将这些值合并为单个String变量中的逗号(,)分隔列表,如:

    public static String getParameter( HttpServletRequest request,
        String parameterName )
{

    if ( request.getCharacterEncoding( ) == null )
    {
        try
        {
            request.setCharacterEncoding( UTF_8_ENCODE );
        }
        catch ( UnsupportedEncodingException e )
        {
        }
    }
    String[] values = request.getParameterValues(parameterName);
    String temp="";
    if(values.length>1)
    {
        int i=0;
       for(i=0;i<values.length-1;i++)
       {
         temp=temp+values[i]+",";
       }
       temp=temp+values[i];
    }
    else
    {
        temp = values[0];
    }

    return temp;
}

在HashMap中,我成功获取所有参数及其各自的值,并将Map设置为:

HashMap<String,Object> tempMap = new HashMap<String,Object>(); 
    tempMap = discoverAndSetParameters( runnable, request ); 
    for(String str : tempMap.keySet())
    {
        System.out.println("Key : "+str);
        System.out.println("Value : "+tempMap.get(str));
    }
    iRunTask.setParameterValues(tempMap);

这里runnable是IReportRunnable的对象,request是HttpServletRequest的对象。 现在,当我运行Web应用程序时,单击名为&#34; Reports&#34;的超链接。我在控制台上遇到异常,网页上没有输出。

org.eclipse.birt.report.engine.api.impl.ParameterValidationException: The type of parameter "Metal" is expected as "Object[]", not "java.lang.String".
at org.eclipse.birt.report.engine.api.impl.EngineTask.validateAbstractScalarParameter(EngineTask.java:857)
at org.eclipse.birt.report.engine.api.impl.EngineTask.access$0(EngineTask.java:789)
at org.eclipse.birt.report.engine.api.impl.EngineTask$ParameterValidationVisitor.visitScalarParameter(EngineTask.java:706)
at org.eclipse.birt.report.engine.api.impl.EngineTask$ParameterVisitor.visit(EngineTask.java:1531)
at org.eclipse.birt.report.engine.api.impl.EngineTask.doValidateParameters(EngineTask.java:692)
at org.eclipse.birt.report.engine.api.impl.RunTask.doRun(RunTask.java:214)
at org.eclipse.birt.report.engine.api.impl.RunTask.run(RunTask.java:86)

请帮助我如何解决此问题,并再次指定我使用Excel数据源而不是JDBC或Scripted以及所有这些。我已经浏览了许多博客,其中的问题与JDBC数据源有关,但对我没有帮助。

1 个答案:

答案 0 :(得分:0)

当listbox参数声明为&#34;允许多个值&#34;时,BIRT引擎需要一组值,但在您的情况下,您发送一个String。 因此,当您检测到多值参数时,您应该构建一个java数组值并将此数组传递给参数映射,而不是构建以逗号分隔的String。这样它就可以了。

这个数组的小心元素应该具有BIRT所期望的数据类型:if&#34; Metal&#34;参数设置为&#34; String&#34;输入您的报告设计,然后您就可以使用&#34;值&#34;数组来自getParameter函数,否则有必要构建一个新数组。