Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获得;没有为';plsql';“语言”;Java代码中的异常_Java_Plsql_Jasper Reports - Fatal编程技术网

获得;没有为';plsql';“语言”;Java代码中的异常

获得;没有为';plsql';“语言”;Java代码中的异常,java,plsql,jasper-reports,Java,Plsql,Jasper Reports,我有一个简单的报告,显示数据库中的字段。我在Jasper中设置了一个数据适配器,并将查询放入其中。我可以从Jasper成功地预览报告,但是当涉及到Java时,它无法编译报告并显示以下异常 2014年6月18日下午3:17:49 org.apache.commons.digester.digester-endElement 严重:结束事件引发异常 原因:net.sf.jasperreports.engine.JRRuntimeException:没有为“plsql”语言注册查询执行器工厂 java

我有一个简单的报告,显示数据库中的字段。我在Jasper中设置了一个数据适配器,并将查询放入其中。我可以从Jasper成功地预览报告,但是当涉及到Java时,它无法编译报告并显示以下异常

2014年6月18日下午3:17:49 org.apache.commons.digester.digester-endElement 严重:结束事件引发异常

原因:net.sf.jasperreports.engine.JRRuntimeException:没有为“plsql”语言注册查询执行器工厂

java.lang.reflect.InvocationTargetException 2014年6月18日下午3:17:49 me.jasper.print.statement打印生成器报告 严重:空

net.sf.jasperreports.engine.JRException:org.xml.sax.SAXParseException;行号:7;栏目号:16;第7行字符16处出错:没有为“plsql”语言注册查询执行器工厂

原因:org.xml.sax.saxpasseeption;行号:7;栏目号:16;第7行字符16处出错:没有为“plsql”语言注册查询执行器工厂

这是我的Jasper报表查询设置

<property name="com.jaspersoft.studio.data.defaultdataadapter" value="testDataAdapter"/>
<queryString language="plsql">
    <![CDATA[CALL getStatementDetails(250001 , "2012-01-01" , "2015-01-01" , 0 , 0)]]>
</queryString>

这是我的Java代码

JasperDesign jasperDesign = JRXmlLoader.load(new File("/home/mint/JaspersoftWorkspace/MyReports/ar/plsql.jrxml"));
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
JasperPrint print = JasperFillManager.fillReport(jasperReport, new HashMap<>()); 
JasperViewer jasperViewer = new JasperViewer(print, false);
jasperViewer.setVisible(true);
JasperDesign-JasperDesign=jrxmloader.load(新文件(“/home/mint/JaspersoftWorkspace/MyReports/ar/plsql.jrxml”);
JasperReport-JasperReport=JasperCompileManager.compileReport(jasperDesign);
JasperPrint print=JasperFillManager.fillReport(jasperReport,newhashmap());
JasperViewer=新JasperViewer(打印,假);
jasperViewer.setVisible(true);

您必须指定查询执行器工厂,因为默认情况下JasperReports库中不包括对plsql的支持。在iReport中(至少在旧版本中),我相信这是默认为您设置的。您可以通过以下方式在iReport GUI中进行验证:

  • 菜单工具->选项->查询执行器
  • 具体而言:
    • 语言=plsql
    • 工厂类=com.jaspersoft.jrx.query.PlSqlQueryExecuterFactory
    • 字段提供程序类=com.jaspersoft.ireport.designer.data.fieldsproviders.SQLFieldsProvider
要在Java中执行同样的操作,必须执行以下操作:

请注意,在最新版本中,类名已更改。因此,您可能需要使用
QueryExecuterFactory
,而不是
JRQueryExecuterFactory
。(如果这没有帮助,您应该指定您正在使用哪个版本的JasperReports。)您还需要确保JasperReports扩展库位于类路径中。您可以在iReports lib目录中找到该jar

外部资源:


谢谢。我使用Jaspersoft Studio 5.6.0,无法从GUI中找到您提到的查询执行器。请注意,该报告在Jaspersoft Studio 5.6.0的预览模式下工作正常,但在java中工作不正常。Jaspersoft Studio可能类似于iReport,默认情况下可能包括PlSqlQueryExecutor配置。根据我的回答,为了直接用Java运行报告,您需要在代码中进行一些手动配置。再次感谢。这很有效。你能帮忙吗
jasperReport.setProperty( "net.sf.jasperreports.query.executer.factory.plsql"
                            ,"com.jaspersoft.jrx.query.PlSqlQueryExecuterFactory");

//Maybe this too, but not positive
JRProperties.setProperty( JRQueryExecuterFactory.QUERY_EXECUTER_FACTORY_PREFIX+"plsql"
                           ,"com.jaspersoft.jrx.query.PlSqlQueryExecuterFactory");