Bonjour à tous....
J'utilise le driver JDBC Connector/J de AB pour me connecter à une base
de données MySQL.
Tout fonctionne bien depuis déjà deux ans.
Entre autre données stockées, je stock des objets.
La version 3.0.17 du driver fonctionne correctement par contre, quand
j'ai installé la version 3.1.10, impossible de "désèrialiser" les
objets, une classcast exception est systèmatiquement levé...
Le problème est le même avec la version 3.2.0 béta.
Ci dessous le code qui lève l'exception avec les version 3.1 et 3.2 du
driver mais qui fonctionne correctement avec la version 3.0.
/**
* Lecture d'un Object au sens java du terme.
* @param query la requète permettant de localiser l'Object.
* @param columnIndex l'index de la colonne du ResultSet obtenu
aprés lancement de la requète
* auquel sera trouvé l'Object.
* <strong>Attention</strong> : Cette méthode utilise l'index du
{@link java.sql.PreparedStatement} sous-jacent.
* Les index sont donc {1, 2, 3} etc... (pas d'index 0).
* @exception SQLException en cas d'erreur d'accés à la
base de données.
*/
public Object readObject (String query, int columnIndex)
throws SQLException
{
PreparedStatement ps = connection.prepareStatement (query);
resultSet = ps.executeQuery ();
resultSet.first ();
try
{
Object result = resultSet.getObject (columnIndex);
resultSet.close ();
return (result);
}
catch (NullPointerException n)
{
return (null);
}
catch (SQLException s)
{
return (null);
}
}
Ci dessous la ligne qui lève l'exception (ClassCastException). planning[idx] = (Planning) GaoBureau.getJa ("DataAlias").readObject (query, 1);
A noter le fait qu'en tracant le programme, je n'ai même pas pu faire un Object test = (Object) GaoBureau.getJa ("DataAlias").readObject (query, 1); Cette ligne aussi lève une exception.
Je soupconne un problème de page de code.
damien guerin wrote:
Quelle est la ligne concernée? Il est où le cast?
Bonjour,
Ci dessous la ligne qui lève l'exception (ClassCastException).
planning[idx] = (Planning) GaoBureau.getJa ("DataAlias").readObject
(query, 1);
A noter le fait qu'en tracant le programme, je n'ai même pas pu faire un
Object test = (Object) GaoBureau.getJa ("DataAlias").readObject (query, 1);
Cette ligne aussi lève une exception.
Ci dessous la ligne qui lève l'exception (ClassCastException). planning[idx] = (Planning) GaoBureau.getJa ("DataAlias").readObject (query, 1);
A noter le fait qu'en tracant le programme, je n'ai même pas pu faire un Object test = (Object) GaoBureau.getJa ("DataAlias").readObject (query, 1); Cette ligne aussi lève une exception.
Je soupconne un problème de page de code.
Francis JUGE-BOIRARD
Une information suplémentaire.
Le problème se manifeste seulement lors de la désérialisation d'un objet. Pour le démontrer, j'ai fait le test suivant : Sérialisation avec le driver 3.1 Lecture (sans problème) avec le driver 3.0 de l'objet sérialisé avec la version 3.1.
Une information suplémentaire.
Le problème se manifeste seulement lors de la désérialisation d'un objet.
Pour le démontrer, j'ai fait le test suivant :
Sérialisation avec le driver 3.1
Lecture (sans problème) avec le driver 3.0 de l'objet sérialisé avec la
version 3.1.
Le problème se manifeste seulement lors de la désérialisation d'un objet. Pour le démontrer, j'ai fait le test suivant : Sérialisation avec le driver 3.1 Lecture (sans problème) avec le driver 3.0 de l'objet sérialisé avec la version 3.1.
damien guerin
Que renvoie getJa ?? Un objet perso? Que renvoie Object test = GaoBureau.getJa ("DataAlias").readObject (query, 1); Toujours une Exception? Laquelle? La même? printStack() donne quoi? Il nous manque des billes à priori. Il est évident qu'il y a eu un changement mais c'est très probalement contournable. Je doute qu'il y ait des regressions de ce type...
Que renvoie getJa ?? Un objet perso?
Que renvoie Object test = GaoBureau.getJa ("DataAlias").readObject
(query, 1);
Toujours une Exception? Laquelle? La même?
printStack() donne quoi?
Il nous manque des billes à priori. Il est évident qu'il y a eu un
changement mais c'est très probalement contournable. Je doute qu'il y
ait des regressions de ce type...
Que renvoie getJa ?? Un objet perso? Que renvoie Object test = GaoBureau.getJa ("DataAlias").readObject (query, 1); Toujours une Exception? Laquelle? La même? printStack() donne quoi? Il nous manque des billes à priori. Il est évident qu'il y a eu un changement mais c'est très probalement contournable. Je doute qu'il y ait des regressions de ce type...
Francis JUGE-BOIRARD
Francis JUGE-BOIRARD wrote: Bonjour, à tous..... Ci-dessous la version du code qui pose problème....
/** * Lecture d'un Object au sens java du terme. * @param query la requète permettant de localiser l'Object. * @param columnIndex l'index de la colonne du ResultSet obtenu aprés lancement de la requète * auquel sera trouvé l'Object. * <strong>Attention</strong> : Cette méthode utilise l'index du {@link java.sql.PreparedStatement} sous-jacent. * Les index sont donc {1, 2, 3} etc... (pas d'index 0). * @exception SQLException en cas d'erreur d'accés à la base de données. */ public Object readObject (String query, int columnIndex) throws SQLException { PreparedStatement ps = connection.prepareStatement (query); resultSet = ps.executeQuery (); resultSet.first (); try { Object result = resultSet.getObject (columnIndex); resultSet.close (); return (result); } catch (NullPointerException n) { return (null); } catch (SQLException s) { return (null); } } En lisant la documentation du driver 3.1, je vois la ligne suivante :
Table 1.3. MySQL Types to Java Types for ResultSet.getObject() ... LONGBLOB byte[] Cette ligne indique que les LONGBLOB sont "mapper" comme des byte[].
Ci-dessous la version de mon code qui fonctionne. /** * Lecture d'un Object au sens java du terme. * @param query la requète permettant de localiser l'Object. * @param columnIndex l'index de la colonne du ResultSet obtenu aprés lancement de la requète * auquel sera trouvé l'Object. * <strong>Attention</strong> : Cette méthode utilise l'index du {@link java.sql.PreparedStatement} sous-jacent. * Les index sont donc {1, 2, 3} etc... (pas d'index 0). * @exception SQLException en cas d'erreur d'accés à la base de données. */ public Object readObject (String query, int columnIndex) throws SQLException { PreparedStatement ps = connection.prepareStatement (query); resultSet = ps.executeQuery (); if (!resultSet.first ()) return (null); try { byte[] byteResult = resultSet.getBytes (columnIndex); // Ligne ajouté ObjectInputStream ois = new ObjectInputStream (new ByteArrayInputStream (byteResult)); // Ligne ajouté Object result = ois.readObject (); // Ligne ajouté resultSet.close (); return (result); } catch (NullPointerException n) { n.printStackTrace (); return (null); } catch (SQLException s) { s.printStackTrace (); return (null); } catch (IOException i) { i.printStackTrace (); return (null); } catch (ClassNotFoundException c) { c.printStackTrace (); return (null); } }
Du coup, je ne vois plus bien l'intéret du readObject de la classe resultSet....
Francis JUGE-BOIRARD wrote:
Bonjour, à tous.....
Ci-dessous la version du code qui pose problème....
/**
* Lecture d'un Object au sens java du terme.
* @param query la requète permettant de localiser l'Object.
* @param columnIndex l'index de la colonne du ResultSet obtenu
aprés lancement de la requète
* auquel sera trouvé l'Object.
* <strong>Attention</strong> : Cette méthode utilise l'index du
{@link java.sql.PreparedStatement} sous-jacent.
* Les index sont donc {1, 2, 3} etc... (pas d'index 0).
* @exception SQLException en cas d'erreur d'accés à la
base de données.
*/
public Object readObject (String query, int columnIndex)
throws SQLException
{
PreparedStatement ps = connection.prepareStatement (query);
resultSet = ps.executeQuery ();
resultSet.first ();
try
{
Object result = resultSet.getObject (columnIndex);
resultSet.close ();
return (result);
}
catch (NullPointerException n)
{
return (null);
}
catch (SQLException s)
{
return (null);
}
}
En lisant la documentation du driver 3.1, je vois la ligne suivante :
Table 1.3. MySQL Types to Java Types for ResultSet.getObject()
...
LONGBLOB byte[]
Cette ligne indique que les LONGBLOB sont "mapper" comme des byte[].
Ci-dessous la version de mon code qui fonctionne.
/**
* Lecture d'un Object au sens java du terme.
* @param query la requète permettant de localiser l'Object.
* @param columnIndex l'index de la colonne du ResultSet obtenu
aprés lancement de la requète
* auquel sera trouvé l'Object.
* <strong>Attention</strong> : Cette méthode utilise l'index
du {@link java.sql.PreparedStatement} sous-jacent.
* Les index sont donc {1, 2, 3} etc... (pas d'index 0).
* @exception SQLException en cas d'erreur d'accés à la
base de données.
*/
public Object readObject (String query, int columnIndex)
throws SQLException
{
PreparedStatement ps = connection.prepareStatement (query);
resultSet = ps.executeQuery ();
if (!resultSet.first ())
return (null);
try
{
byte[] byteResult = resultSet.getBytes (columnIndex); // Ligne
ajouté
ObjectInputStream ois = new ObjectInputStream (new
ByteArrayInputStream (byteResult)); // Ligne ajouté
Object result = ois.readObject (); // Ligne ajouté
resultSet.close ();
return (result);
}
catch (NullPointerException n)
{
n.printStackTrace ();
return (null);
}
catch (SQLException s)
{
s.printStackTrace ();
return (null);
}
catch (IOException i)
{
i.printStackTrace ();
return (null);
}
catch (ClassNotFoundException c)
{
c.printStackTrace ();
return (null);
}
}
Du coup, je ne vois plus bien l'intéret du readObject de la classe
resultSet....
Francis JUGE-BOIRARD wrote: Bonjour, à tous..... Ci-dessous la version du code qui pose problème....
/** * Lecture d'un Object au sens java du terme. * @param query la requète permettant de localiser l'Object. * @param columnIndex l'index de la colonne du ResultSet obtenu aprés lancement de la requète * auquel sera trouvé l'Object. * <strong>Attention</strong> : Cette méthode utilise l'index du {@link java.sql.PreparedStatement} sous-jacent. * Les index sont donc {1, 2, 3} etc... (pas d'index 0). * @exception SQLException en cas d'erreur d'accés à la base de données. */ public Object readObject (String query, int columnIndex) throws SQLException { PreparedStatement ps = connection.prepareStatement (query); resultSet = ps.executeQuery (); resultSet.first (); try { Object result = resultSet.getObject (columnIndex); resultSet.close (); return (result); } catch (NullPointerException n) { return (null); } catch (SQLException s) { return (null); } } En lisant la documentation du driver 3.1, je vois la ligne suivante :
Table 1.3. MySQL Types to Java Types for ResultSet.getObject() ... LONGBLOB byte[] Cette ligne indique que les LONGBLOB sont "mapper" comme des byte[].
Ci-dessous la version de mon code qui fonctionne. /** * Lecture d'un Object au sens java du terme. * @param query la requète permettant de localiser l'Object. * @param columnIndex l'index de la colonne du ResultSet obtenu aprés lancement de la requète * auquel sera trouvé l'Object. * <strong>Attention</strong> : Cette méthode utilise l'index du {@link java.sql.PreparedStatement} sous-jacent. * Les index sont donc {1, 2, 3} etc... (pas d'index 0). * @exception SQLException en cas d'erreur d'accés à la base de données. */ public Object readObject (String query, int columnIndex) throws SQLException { PreparedStatement ps = connection.prepareStatement (query); resultSet = ps.executeQuery (); if (!resultSet.first ()) return (null); try { byte[] byteResult = resultSet.getBytes (columnIndex); // Ligne ajouté ObjectInputStream ois = new ObjectInputStream (new ByteArrayInputStream (byteResult)); // Ligne ajouté Object result = ois.readObject (); // Ligne ajouté resultSet.close (); return (result); } catch (NullPointerException n) { n.printStackTrace (); return (null); } catch (SQLException s) { s.printStackTrace (); return (null); } catch (IOException i) { i.printStackTrace (); return (null); } catch (ClassNotFoundException c) { c.printStackTrace (); return (null); } }
Du coup, je ne vois plus bien l'intéret du readObject de la classe resultSet....