Search code examples
javaphpphp-java-bridge

How to pass java.util.Date to Java library with help of php-java bridge


Im using javabridge to connect php to jasper reports and Im trying to pass two parameters but I get warnings and errors

Warning: Unchecked exception detected: [[o:Response$UndeclaredThrowableErrorMarker]:"FATAL: Undeclared java.lang.RuntimeException detected. java.lang.Exception: CreateInstance failed: new java.util.Date((o:String)[o:String]). Cause: java.lang.IllegalArgumentException VM: 1.7.0_79@http://java.oracle.com/" at: #-10 java.util.Date.parse(Unknown Source) #-9 java.util.Date.<init>(Unknown Source) #-8 sun.reflect.GeneratedConstructorAccessor57.newInstance(Unknown Source) #-7 sun.reflect.DelegatingConstructorAccessor[...]/java/Java.inc(361): java_Arg->getResult(false) #2 http://localhost:8080/JavaBridgeTemplate/java/Java.inc(364): java_Client->getWrappedResult(false) #3 http://localhost:8080/JavaBridgeTemplate/java/Java.inc(536): java_Client->getInternalResult() #4 http://localhost:8080/JavaBridgeTemplate/java/Java.inc(1930): java_Client->createObject('java.util.Date', Array) #5 C:\wamp\www\advanced\backend\javabridge\generate.php(49): Java->Java('java.util.Date', '12/Feb/16') #6 {main}] in http://localhost:8080/JavaBridgeTemplate/java/Java.inc on line 202

 Fatal error: Uncaught [[o:Exception]:"java.lang.Exception: Invoke failed: [[c:JasperFillManager]]->fillReport((o:JasperReport)[o:JasperReport], (i:Map)[o:HashMap], (i:Connection)[o:Connection]). Cause: net.sf.jasperreports.engine.JRException: Incompatible php.java.bridge.Response$UndeclaredThrowableErrorMarker value assigned to parameter FInicio in the Reubicados dataset. VM: 1.7.0_79@http://java.oracle.com/" at: #-16 net.sf.jasperreports.engine.fill.JRFillDataset.setParameter(JRFillDataset.java:903) #-15 net.sf.jasperreports.engine.fill.JRFillDataset.setFillParameterValues(JRFillDataset.java:642) #-14 net.sf.jasperreports.engine.fill.JRFillDataset.setParameterValues(JRFillDataset.java:585) #-13 net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:1280) #-12 net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:901) #-11 net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:845) #-10 net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:58) #-9 net.sf.jas in http://localhost:8080/JavaBridgeTemplate/java/Java.inc on line 195

The problem is when it tries to create java.util.Date instance. Here´s php file:

   <?php


    require_once("http://localhost:8080/JavaBridgeTemplate/java/Java.inc");

    try {   
        $Param1 = date('d/M/y', strtotime($_POST['FInicio']));
        $Param2 = date('d/M/y', strtotime($_POST['FFin']));



        $jasperxml = new java("net.sf.jasperreports.engine.xml.JRXmlLoader");
        $jasperDesign = $jasperxml->load(realpath("Reubicados.jrxml"));
        $query = new java("net.sf.jasperreports.engine.design.JRDesignQuery");

        $jasperDesign->setQuery($query);
        $compileManager = new JavaClass("net.sf.jasperreports.engine.JasperCompileManager");
        $report = $compileManager->compileReport($jasperDesign); } catch (JavaException $ex) {
        echo $ex; }


    $fillManager = new JavaClass("net.sf.jasperreports.engine.JasperFillManager"); //aqui se pasan los parametros (Fecha Inicio y Fecha Fin) 
$params = new Java("java.util.HashMap"); 
$date=new Java('java.util.Date',$Param1);
$date1=new Java('java.util.Date',$Param2); 
$params->put("FInicio",$date); 
$params->put("FFin",$date1);



    $class = new JavaClass("java.lang.Class"); $class->forName("com.mysql.jdbc.Driver"); $driverManager = new JavaClass("java.sql.DriverManager");

    //db username and password 
$conn = $driverManager->getConnection("jdbc:mysql://localhost/viajestrafico?zeroDateTimeBehavior=convertToNull", "root", "root"); $jasperPrint = $fillManager->fillReport($report, $params, $conn);

    $exporter = new java("net.sf.jasperreports.engine.JRExporter");

And sql query in ireports:

SELECT
     ayudante_situacion_laboral.`FechaInicio` AS ayudante_situacion_laboral_FechaInicio,
     ayudante_situacion_laboral.`FechaFin` AS ayudante_situacion_laboral_FechaFin,
     ayudante_situacion_laboral.`Cant_Horas` AS ayudante_situacion_laboral_Cant_Horas,
     ayudante_situacion_laboral.`Descripcion` AS ayudante_situacion_laboral_Descripcion,
     ayudante.`Registro` AS ayudante_Registro,
     ayudante.`Nombre` AS ayudante_Nombre,
     situacion_laboral.`Estado` AS situacion_laboral_Estado
FROM
     `ayudante` ayudante INNER JOIN `ayudante_situacion_laboral` ayudante_situacion_laboral ON ayudante.`Ayudante_ID` = ayudante_situacion_laboral.`AyudanteAyudante_ID`
     INNER JOIN `situacion_laboral` situacion_laboral ON ayudante_situacion_laboral.`Situacion_LaboralSitL_ID` = situacion_laboral.`SitL_ID`
WHERE
     situacion_laboral.Estado = 'Reubicado'  and $P{FInicio}<= ayudante_situacion_laboral.`FechaInicio` and $P{FFin}>=ayudante_situacion_laboral.`FechaFin`
UNION

     SELECT
     chofer_situacion_laboral.`FechaInicio` AS chofer_situacion_laboral_FechaInicio,
     chofer_situacion_laboral.`FechaFin` AS chofer_situacion_laboral_FechaFin,
     chofer_situacion_laboral.`Cant_Horas` AS chofer_situacion_laboral_Cant_Horas,
     chofer_situacion_laboral.`Descripcion` AS chofer_situacion_laboral_Descripcion,
     chofer.`Registro` AS chofer_Registro,
     chofer.`Nombre` AS chofer_Nombre,
     situacion_laboral.`Estado` AS situacion_laboral_Estado
FROM
     `chofer` chofer INNER JOIN `chofer_situacion_laboral` chofer_situacion_laboral ON chofer.`Chofer_ID` = chofer_situacion_laboral.`ChoferChofer_ID`
     INNER JOIN `situacion_laboral` situacion_laboral ON chofer_situacion_laboral.`Situacion_LaboralSitL_ID` = situacion_laboral.`SitL_ID`
WHERE
     (situacion_laboral.Estado = 'Reubicado' and $P{FInicio}<= chofer_situacion_laboral.`FechaInicio` and $P{FFin}>=chofer_situacion_laboral.`FechaFin`)

Solution

  • It was simple, just a problem I had from the beginning in php code.

        $query = new java("net.sf.jasperreports.engine.design.JRDesignQuery");
    
        $jasperDesign->setQuery($query);
    

    This code was preventing xrml query from executing, because it was creating a query object empty.