net.sf.jasperreports.engine.design.JRValidationException - параметр запроса не найден - PullRequest
0 голосов
/ 18 декабря 2011

Я использую JasperServer и PHP JavaBridge для генерации отчетов в формате PDF через JasperServer внутри PHP.Я получаю ошибку компиляции из-за пропущенного (неназначенного) параметра, переданного компилятору 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 {} параметров и останавливается в противном случае)

$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?

1 Ответ

0 голосов
/ 18 декабря 2011
$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}, теперь он хорошо компилируется и позже1005 *

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

параметры назначаются во время заполнения

...