我正在使用symfony 2 php构建一个Web应用程序。我想使用jasperreports生成一些报告。我使用Java Bridge,我在tomcat 7中部署了Java网桥战争,但是当我尝试生成报告时,我遇到了错误。
所以这是我控制器中的代码
require_once("http://localhost:8080/JavaBridge/java/Java.inc");
$reportsPath ="D:/jaspertest/";
$reportFileName = "report";
$jasperReportsLib = "D:/Programmes/jasperReport/lib";
$java_library_path = '';
$handle = @opendir($jasperReportsLib);
while(($new_item = readdir($handle))!==false) {
$java_library_path .= 'file:'.$jasperReportsLib.'/'.$new_item .';';
}
java_require($java_library_path);
$sJcm = new JavaClass("net.sf.jasperreports.engine.JasperCompileManager");
$report = $sJcm->compileReport($reportsPath .$reportFileName.".jrxml");
$map = new Java("java.util.HashMap");
$emptyDataSource = new Java("net.sf.jasperreports.engine.JREmptyDataSource");
$sJfm = new JavaClass("net.sf.jasperreports.engine.JasperFillManager");
$print = $sJfm->fillReport($report,$map,$emptyDataSource);
$sJem = new JavaClass("net.sf.jasperreports.engine.JasperExportManager");
$sJem->exportReportToPdfFile($print, $reportsPath .$reportFileName.".pdf");
set_time_limit(0);
@readfile($reportsPath .$reportFileName.".pdf");// or die("problem occurs.");
$response = new Response($reportsPath .$reportFileName.".pdf");
$response->headers->set('Content-type', 'application/pdf');
$response->headers->set('Content-Disposition', 'attachement; filename=Report.pdf');
$response->headers->set('Cache-Control', 'must-revalidate');
return $response;
以下是我得到的例外情况:
Symfony\Component\Debug\Exception\ContextErrorException: Notice: fwrite():
at n/a
in http://localhost:8080/JavaBridge/java/Java.inc line 482
at Symfony\Component\Debug\ErrorHandler->handleError('8', 'fwrite(): ', 'http://localhost:8080/JavaBridge/java/Java.inc', '482', array('data' => ''))
in line
at fwrite(resource, '')
in http://localhost:8080/JavaBridge/java/Java.inc line 482
at java_SocketChannel->fwrite('')
in http://localhost:8080/JavaBridge/java/Java.inc line 528
at java_SocketHandler->write('')
in http://localhost:8080/JavaBridge/java/Java.inc line 671
at java_HttpHandler->redirect()
in http://localhost:8080/JavaBridge/java/Java.inc line 743
at java_Protocol->redirect()
in http://localhost:8080/JavaBridge/java/Java.inc line 755
at java_Protocol->finish()
in http://localhost:8080/JavaBridge/java/Java.inc line 794
at java_Protocol->invokeEnd()
in http://localhost:8080/JavaBridge/java/Java.inc line 359
at java_Client->invokeMethod('0', 'updateJarLibraryPath', array('file:D:/Programmes/jasperReport/lib/.;file:D:/Programmes/jasperReport/lib/..;file:D:/Programmes/jasperReport/lib/jasperreports-5.6.0.jar;file:D:/Programmes/jasperReport/lib/jasperreports-applet-5.6.0.jar;file:D:/Programmes/jasperReport/lib/jasperreports-fonts-5.6.0.jar;file:D:/Programmes/jasperReport/lib/jasperreports-javaflow-5.6.0.jar;', 'c:/wamp/bin/php/php5.5.12/ext/', 'C:\wamp\www\syslife_v1\web', '.;C:\php\pear'))
in http://localhost:8080/JavaBridge/java/Java.inc line 986
at java_require('file:D:/Programmes/jasperReport/lib/.;file:D:/Programmes/jasperReport/lib/..;file:D:/Programmes/jasperReport/lib/jasperreports-5.6.0.jar;file:D:/Programmes/jasperReport/lib/jasperreports-applet-5.6.0.jar;file:D:/Programmes/jasperReport/lib/jasperreports-fonts-5.6.0.jar;file:D:/Programmes/jasperReport/lib/jasperreports-javaflow-5.6.0.jar;')
in C:\wamp\www\syslife_v1\src\MamdaIT\ComptabiliteBundle\Controller\BordereauController.php line 372
at MamdaIT\ComptabiliteBundle\Controller\BordereauController->editionDetailBordereau(object(Request), '66')
in line
at call_user_func_array(array(object(BordereauController), 'editionDetailBordereau'), array(object(Request), '66'))
in C:\wamp\www\syslife_v1\vendor\symfony\symfony\src\Symfony\Component\HttpKernel\HttpKernel.php line 144
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), '1')
in C:\wamp\www\syslife_v1\vendor\symfony\symfony\src\Symfony\Component\HttpKernel\HttpKernel.php line 64
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), '1', true)
in C:\wamp\www\syslife_v1\vendor\symfony\symfony\src\Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel.php line 69
at Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel->handle(object(Request), '1', true)
in C:\wamp\www\syslife_v1\vendor\symfony\symfony\src\Symfony\Component\HttpKernel\Kernel.php line 185
at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
in C:\wamp\www\syslife_v1\web\app_dev.php line 30
我到处寻找,但我无法找到解决方案,我错过了什么?
答案 0 :(得分:1)
这里有多个问题,但我会尝试逐步解释:
<强> 1。代码部分。
您不应该使用java_require
从PHP动态添加库依赖项(已从v6中删除)。
<强> 2。错误报告
正如您所注意到的,symfony错误处理程序无法提供非常有用的信息(没有明确的消息)。不是symfony问题,而是更多关于Java.inc
客户端处理异常/错误的方式。必须使用getLastException
显式检索桥接异常(java桥接端)(不是100%正确,但我们假设它使事情变得简单)。当然没有错误处理程序(symfony,whoops ......)支持这个。
那该怎么办?
<强> 1。修复java libs的注册
您的依赖项必须在war包(通常称为 JavaBridgeTemplate.war )或tomcat global lib
目录中提供。
我个人更喜欢第一种方法来防止可能的碰撞,它可以通过以下任何一种方法来实现:
将jar添加到war文件中的WEB-INF / lib目录中并重新部署(这通常是大多数php devs 的完成方式)。
或者另一个选项(完全自以为是,基于我几个月前发起的javabridge fork ),就是建立自己的jar。作为jasper和mysql的快速示例,您可以使用以下命令下载,解压缩并构建自己的java bridge war:
wget https://github.com/belgattitude/php-java-bridge/archive/7.0.0.zip -O pjb.zip
unzip pjb.zip && cd php-java-bridge-7.0.0
./gradlew war -I init-scripts/init.jasperreports.gradle -I init-scripts/init.mysql.gradle
构建的war文件将在
./build/libs
文件夹中提供, 准备部署。
更完整的安装位于:http://docs.soluble.io/soluble-japha/install_server/#build-and-customize
<强> 2。错误报告问题。
symfony错误处理程序(或whoops ...)不能很好地与Java.inc
客户端一起使用,调试实际上可能是一团糟。我建议改用soluble-japha客户端:https://github.com/belgattitude/soluble-japha
除其他外,它将以更标准的方式抛出异常,请参阅here。
soluble-japha
只是客户端部分,它取代了Java.inc
,并且与官方的php-java-bridge 6/7和可溶性php-java-bridge服务器实现兼容。你必须轻微改变你的PHP代码,但没有什么比这更难。请参阅documentation website。
从那里你可以更好地了解问题。
希望它有所帮助。