net.sf.jasperreports.engine.design.JRValidationException - 未找到查询参数

时间:2011-12-17 23:25:24

标签: php jasper-reports jasperserver php-java-bridge

我使用JasperServer和PHP JavaBridge通过PHP内的JasperServer生成PDF报告。由于传递给JRXML编译器

的缺失(未分配)参数,我得到编译错误
Fatal error: Uncaught [[o:Exception]:
"java.lang.Exception: Invoke failed: 
[[c:JasperCompileManager]]->compileReport((o:String)[o:String]). 
Cause: net.sf.jasperreports.engine.design.JRValidationException: 
**Report design not valid** : 1. **Query parameter not found** : db_field_id VM: 
1.6.0_18@http://java.sun.com/" at: #-12
net.sf.jasperreports.engine.design.JRAbstractCompiler.verifyDesign(JRAbstractCompiler.java:258)

我无法找到通过我的

的方法
$params = new Java("java.util.HashMap");
foreach ($jrxml_params as $key => $jr_param) $params->put($key, $jr_param); 

编译方法的参数列表,我也可以通过

禁用此验证
$japser_props = new JavaClass("net.sf.jasperreports.engine.util.JRProperties");
$japser_props->COMPILER_XML_VALIDATION  = false;

以下是我用来生成PDF的内容(如果JRXML文件不包含$ P {} pamareters,则工作正常,否则暂停)

$class = new JavaClass("java.lang.Class");
$class->forName("com.mysql.jdbc.Driver");
$driverManager = new JavaClass("java.sql.DriverManager");
$conn = $driverManager->getConnection("jdbc:mysql://localhost:3306/XXX?user=XXX&password=1234");

$compileManager = new JavaClass("net.sf.jasperreports.engine.JasperCompileManager");
$report = $compileManager->compileReport(realpath("/www/some.jrxml"));

$params = new Java("java.util.HashMap");
foreach ($jrxml_params as $key => $jr_param) $params->put($key, $jr_param); 

$jasperPrint = $fillManager->fillReport($report, $params, $conn);
$exportManager = new JavaClass("net.sf.jasperreports.engine.JasperExportManager");
$outputPath = realpath(".")."/"."output.pdf";
$exportManager->exportReportToPdfFile($jasperPrint, $outputPath);

我如何避免这个错误,我知道我需要通过什么,我不知道如何做到这一点,我不能只是将params传递给fillManager吗?

1 个答案:

答案 0 :(得分:0)

$japser_props = new JavaClass("net.sf.jasperreports.engine.util.JRProperties");
$japser_props->setProperty('net.sf.jasperreports.compiler.xml.validation',true);

这是从PHP设置属性的方法,但这不是问题。事实证明一切都很好,我在MySQL查询之前错过了参数声明...把

<parameter name="db_field_id" class="java.lang.Integer">

在你的JRXML中使用它之前它是$ P {db_field_id}现在它可以很好地汇编而且以后

$jasperPrint = $fillManager->fillReport($report, $params, $conn);

参数在填充时分配