2016-11-18 1 views
1

Im используя javabridge для подключения PHP Джаспера отчетов и Im пытается передать два параметра, но я получаю предупреждение и ошибкиКак пройти в библиотеку java.util.Date Java с помощью PHP-Java моста

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: [email protected]://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: [email protected]://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 

Проблема заключается в том, когда он пытается создать экземпляр java.util.Date. Here's файл PHP:

<?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"); 

И SQL-запрос в 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`) 

ответ

1

Это было просто, просто проблема, которую я имел с самого начала в php-коде.

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

    $jasperDesign->setQuery($query); 

Этот код предотвращал выполнение запроса xrml, поскольку он создавал объект запроса пустым.

3

Глядя на ваше сообщение об ошибке, то java.util.Date не может быть создан с '12/февраль/16' :

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 

Если вы хотите создания экземпляра объекта даты Java, используйте java.util.Date(long date) конструктор, который принимает метку времени, выраженное в миллисекундах:

<?php 
$startDate = $_POST['FInicio']; // better to filter this :) 
$Param1 = strtotime($startDate) * 1000; // to get milliseconds 
if ($Param1 == 0) { 
    throw new Exception("FInicio date parameter could not be parsed"); 
} 

// ... 
$javaDate = new Java('java.util.Date',$Param1); // This is a java date 

Ваш параметр $date теперь должен быть действительным java.util.Date объектом.

Вы можете проверить это:

$simpleDateFormat = new Java("java.text.SimpleDateFormat", 'yyyy-MM-dd'); 
echo $simpleDateFormat->format($javaDate); 
// should print your date in Y-m-d format 

В качестве альтернативы, вы можете разобрать дату в Java через java.text.SimpleDateFormatter объекта:

$date = '2016-12-21'; 
$simpleDateFormat = new Java("java.text.SimpleDateFormat", 'yyyy-MM-dd'); 
$javaDate = $simpleDateFormat->parse($date); // This is a Java date 

Оба подхода работы ...


JasperReport вопрос с датой

Не совсем связан с вашим вопросом, но если вы хотите использовать дату в качестве параметра запроса вы должны использовать java.sql.Date(long date) объект вместо java.util.Date ... Вот маленький грязный сниппет суммировать изменения:

// php 

$sqlDate = new Java('java.sql.Date', strtotime($_POST['FInicio']) * 1000)); 
$params->put('FInicio', $sqlDate); 

// in your report header (.jrxml): 
<parameter name="FInicio" class="java.sql.Date"> 

// in your report query (.jrxml): 
$P{FInicio} <= chofer_situacion_laboral.`FechaInicio` 

Вы также можете посмотреть клиенту soluble-japha javabridge (переработан Java.inc клиента), синтаксис отличается би t, но есть a documentation about dates, что может показаться полезным.

+0

Спасибо. Я пытаюсь использовать первый подход, но мне нужен объект, отформатированный как d/M/y для построения запроса. Таким образом, я получаю пустые результаты, точно так же. Любой совет? –

+0

Глядя на ваше предыдущее сообщение, вы определяете свои параметры даты как «Дата» –

+0

Глядя на ваше предыдущее сообщение, вы определили свои даты как «java.util.Date» ...Если вы хотите создать свой запрос с ними, это должно быть сделано на стороне яшмы. Если yo хочет избежать jasper-стороны, вы всегда можете указать свои параметры jasper как «java.lang.String()», и вместо подготовки даты в php отправьте даты как текст. –

Смежные вопросы