使用jasperreports Java桥和symfony时出现问题

时间:2017-04-13 10:05:18

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

我正在使用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

我到处寻找,但我无法找到解决方案,我错过了什么?

1 个答案:

答案 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

从那里你可以更好地了解问题。

希望它有所帮助。