2017-04-13 4 views
0

symfony 2 php를 사용하여 웹 응용 프로그램을 작성하고 있습니다. jasperreports를 사용하여 일부 보고서를 생성하려고합니다. Java Bridge를 사용했고 Java Bridge 전쟁을 내 Tomcat 7에 배포했지만 보고서를 생성하려고 할 때 오류가 발생합니다. ,jasperreports 사용 중 발생하는 문제 Java Bridge 및 심포니

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 

내가 사방 보았다 그러나 나는 해결책을 찾을 수 없습니다 내가 뭔가를 놓친 거지 : 그래서 여기

여기 내 컨트롤러

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; 

을 내 코드와 예외 내가 얻을 수있다 ? 여기

답변

1

여러 문제,하지만 난 단계별로 설명하려고합니다 :

1. 코드 부분을.

PHP에서 라이브러리 종속성을 동적으로 추가하는 데는 java_require을 사용하면 안됩니다 (v6에서 제거되었습니다).

2. 오류는 심포니 오류 처리기가 매우 도움이되는 정보 (명확한 메시지)를 제공 할 수있는 발견으로

을보고. 심포니 문제는 아니지만 Java.inc 클라이언트가 예외/오류를 처리하는 방식에 대해 자세히 설명합니다. 브릿지 예외 (자바 브리지 쪽)는 getLastException (은 100 % 정확하지는 않지만 명시 적으로는으로 가정)을 사용하여 명시 적으로 검색해야합니다. 물론 에러 핸들러 (symfony, whoops ...)는 이것을 지원하지 않습니다.


그럼 어떻게해야합니까?

1. 수정 (종종 JavaBridgeTemplate.war을 소위)

의존성 중 하나 전쟁 번들로 제공되어야 자바 libs와의 등록 또는 바람둥이 글로벌 lib 디렉토리입니다.

는 Personnally 나는 가능한 충돌을 방지하는 첫 번째 방법을 선호하고 하나에 의해 달성 될 수있다 :

  • 이 전쟁 파일 내의 당신의 WEB-INF/lib 디렉토리 및 재배치에 항아리의 (입니다 추가 일반적으로 어떻게 대부분의 PHP 개발자에 의해 이루어졌다).

  • 또 다른 옵션 (내가 몇 달 전에 시작한 javabridge fork을 완전히 근거로하고으로 시작)은 자신 만의 병을 만드는 것입니다. 에 준비,

    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 
    

가 지은 전쟁 파일이 ./build/libs 폴더에서 사용할 수 있습니다 : 재스퍼와 MySQL과 빠른 예를 들어, 당신은 다운로드 할 수 있습니다, 압축을 풀고 사용하여 자신의 자바 브리지 전쟁을 구축 배포하십시오.

더 완벽한 설치가 위치 : http://docs.soluble.io/soluble-japha/install_server/#build-and-customize

2. 오류보고 문제.

Java.inc 클라이언트에서 symfony 오류 처리기 (또는 whoops ...)가 제대로 작동하지 않아 디버깅이 실제로 엉망이 될 수 있습니다. 나는 가용성 -japha 클라이언트 대신에 https://github.com/belgattitude/soluble-japha 을 사용하는 것이 좋습니다. 다른 것들 중에서도 더 일반적인 방법으로 예외를 던질 것입니다 (here 참조).

soluble-japha은 클라이언트 부분 일 뿐이며 Java.inc을 대체하며 공식 php-java-bridge 6/7 및 가용성있는 php-java-bridge 서버 구현과 호환됩니다. 당신은 약간의 PHP 코드를 변경해야하지만 매우 어려운 일은 없을 것입니다. documentation website을 참조하십시오.

거기에서 문제를보다 잘 파악할 수 있습니다.

희망이 있습니다.

+0

감사합니다. 그것은 매우 도움이되었다. – Chaaaaz