2011-12-17 21 views
0

我使用JasperServer和PHP JavaBridge通過JasperServer在PHP中生成PDF報告。我得到的編譯,因爲傳遞到JRXML編譯器丟失(未分配)參數net.sf.jasperreports.engine.design.JRValidationException - 查詢參數未找到

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: 
[email protected]://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); 

則params的列表傳遞給編譯方法,也可以停用此驗證的錯誤通過

$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); 

我如何避免這個錯誤,我知道我需要通過什麼,我不知道一種方法來做到這一點,我不能只是傳遞給fillManager的參數?

回答

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現在compliles罰款之前和之後

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

參數分配在填充時間