J'ai le problème suivant :
J'ai essayé de créer une fonctionnalité simple de téléchargement de fichiers dans Grails. J'ai juste créé une classe de domaine avec un
byte[] rawFile
en tant que propriété. Grails a fait la plupart du reste pour moi. Cela a bien fonctionné pour le hsqldb standard dans l'environnement de développement.
Puis je l'ai déployé sur le serveur avec un db oracle configuré (thin driver). Tout fonctionne bien avec la base de données Oracle, sauf le téléchargement de fichiers. Pour le téléchargement de fichier, j'obtiens (pour autant que je m'en souvienne)
SQLException : ORA-01461 : peut lier une valeur LONG uniquement pour l'insertion dans un LONG.
J'ai essayé plusieurs façons de résoudre ce problème (y compris certains columnmappings en blobs et l'utilisation de java.sql.blob au lieu de byte[]) mais rien n'a vraiment fonctionné et j'ai pris une direction où mon code ne serait plus indépendant de la base de données.
Google ne m'a pas vraiment aidé et mes livres sur Grails ne m'aident pas non plus.
Sauvegarder le fichier sur le disque n'est pas une bonne solution à mon avis.
Voici donc ma question :
comment créer un téléchargement de fichiers dans grails qui fonctionne avec oracle ?
Mise à jour J'ai obtenu quelques informations supplémentaires. J'ai réussi à reproduire le problème avec l'édition XE d'Oracle :
Hibernate crée une colonne VARBINARY(255) pour le fichier rawFile. J'ai donc essayé de télécharger un fichier de 4 octets et cela a fonctionné.
J'ai ensuite changé manuellement le type de la colonne en "blob" et cela a fonctionné avec des fichiers plus gros.
J'ai ensuite ajouté
static mapping = {
columns {
rawFile type:'blob'
}
}
à ma classe de domaine et ça a cessé de fonctionner :
ERROR errors.GrailsExceptionResolver - [B ne peut pas être converti en java.sql.Blob java.lang.ClassCastException : [B ne peut pas être converti en java.sql.Blob
:-(