IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java EE Discussion :

Renvoi d'un InputStream [EJB]


Sujet :

Java EE

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 76
    Points : 83
    Points
    83
    Par défaut Renvoi d'un InputStream
    Bonjour,

    j'ai une base de données PostrgeSQL dans laquelle je stocke des images (BYTEA). Lorsque je veux afficher ces fichiers dans une page web, je passe par un InputStream et j'affiche byte par byte. Ca marche tres bien avec une page jsp. Le probleme est qu'aujourd'hui je souhaite passer par des EJBs. J'ai donc ma fonction qui recupere dans un resultset le resultat de ma requete, puis je voulais que la fonction de mon ejb me renvoie le InputStream a traiter. La fonction de l'EJB ne me renvoie jamais rien et j'ai l'impression qu'on ne peut pas renvoyer un InputStream. Quelqu'un a une idee? Y a t il une solution? Dois je renvoyer mon resulset a la place? Serait ce assez propre?
    Merci d'avance pour vos réponses

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 76
    Points : 83
    Points
    83
    Par défaut
    J'ai réalisé une classe Photo à part que j'ai implémenté Serializable.
    Dans cette classe, j'ai une liste qui prend des InputStream et des méthodes d'accès get et set.
    Dans l'interface distante, j'ai créé une méthode getlistephotos(id_user) renvoyant cette classe au lieu d'un objet Collection.
    Dans le bean ejb, cette méthode accède à la base de donnée et ainsi je passe le résultat de la requête (InputStream) dans la méthode set de la classe Photos.

    Mais quand on récupère l'objet photos, il nous sort l erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    java.rmi.UnmarshalException: IOException unmarshalling returnjava.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: beanPhoto.InputPhoto
    	at org.objectweb.carol.rmi.jrmp.server.JUnicastRef.invoke(JUnicastRef.java:176)

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Je ne pense pas que la spec EJB permettes de transmettre des stream comme ça, essaye de récupérer le "contenu" de ton stream dans un byte[] peut etre.
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  4. #4
    Membre confirmé
    Avatar de bmoussaud
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2003
    Messages : 218
    Points : 555
    Points
    555
    Par défaut
    Dans ce cas la tu peux retourner un byte[] qui peut être manipulé facilement ensuite avec les classes ByteArrayInPut/OuputStream
    Benoit Moussaud - XebiaLabs - Automatisation des déploiements. Screencast & Demo

  5. #5
    Membre actif Avatar de austin P.
    Inscrit en
    Juin 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juin 2004
    Messages : 182
    Points : 239
    Points
    239
    Par défaut
    ce n'est pas possible : un InputStream n'est pas serializable
    En essayant continuellement on finit par réussir. Donc : plus ça rate, plus on a de chance que ça marche. (Jacques Rouxel : "Les shadoks")

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 76
    Points : 83
    Points
    83
    Par défaut
    J'ai trouvé la solution et j en fais profiter tout le monde pour ceux que ca interesse :

    Tout d'abord la méthode de l EJB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    public InputPhoto getPhotoPerso(int id_user)
    {
    	String PhotoStatement = "Select photo from photos where id_user= ? ";
     
    	InputStream in;
    	ArrayList listePhotos = new ArrayList();
    	byte [] b;
    	 b = new byte[0x7a120]; 
    	 int i=0;
     
     
    	try{
     
    		Connection con = getConnection();
    		PreparedStatement ps=con.prepareStatement(PhotoStatement);
    		ps.setInt(1, id_user);
    		ResultSet rs = ps.executeQuery();
     
    		if (rs.next()){
               in = rs.getBinaryStream(1);	
               PhotoRes = new InputPhoto(in);   
    		}
    		con.close();
     
    	}
     
    	catch(Exception sqle){
    		System.out.println(sqle.getMessage());
    	}
    	return PhotoRes;
    }
    La classe InputPhoto :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    public class InputPhoto extends InputStream implements Serializable{
     
    	 private byte[] data = null;
    	 protected byte buf[];
    	 protected int pos;
    	 protected int mark = 0;
    	 protected int count;
     
    	public InputPhoto(InputStream ins) throws IOException
    	{
    	    List byteList = new ArrayList();
    	    int dat = ins.read();
    	    while (dat != -1)
    	    {
    	    byteList.add(new Byte((byte)dat));
    	    dat = ins.read();
    	    }
     
    	    data = new byte[byteList.size()];
    	    int counter = 0;
    	    Iterator itr = byteList.iterator();
    	    while(itr.hasNext())
    	    {
    	    data[counter++] = ((Byte)itr.next()).byteValue();
    	    }
    	    ins.close();
    	    this.buf = this.data;
    	    this.pos = 0;
    	    this.count = this.buf.length;
    	    }
     
    	 public int read(byte b[]) throws IOException
    	 {
    	  System.err.println("read(byte b[])");
    	  return read(b, 0, data.length);
    	 }
     
    	 public synchronized int read(byte b[], int off, int len)
    	 {
    	  if (b == null)
    	  {
    	  throw new NullPointerException();
    	  }
    	  else if ((off < 0) || (off > b.length) || (len < 0) ||((off + len) > b.length) || ((off + len) < 0))
    	  {
    	  throw new IndexOutOfBoundsException();
    	  }
    	  if (pos >= count)
    	  {
    	  return -1;
    	  }
    	   if (pos + len > count)
    	  {
    	  len = count - pos;
    	  }
    	 if (len <= 0)
    	 {
    	  return 0;
    	  }
    	  System.arraycopy(buf, pos, b, off, len);
    	  pos += len;
    	  return len;
    	  }
     
    	 public synchronized int read()
    	 {
    	  return (pos < count) ? (buf[pos++] & 0xff) : -1;
    	 }
     
     
    	 public long skip(long n) throws IOException
    	{
    	  System.err.println("skip(long n)");
    	  return 0;
    	}
     
    	 public synchronized void mark(int readlimit)
    	{
    	  System.err.println("mark(int readlimit)");
    	}
     
    	 public boolean markSupported()
    	 {
    	  System.err.println("markSupported()");
    	  return false;
    	 }
     
    	 public synchronized void reset() throws IOException
    	 {
    	  System.err.println("reset()");
    	 }
     
    	 public void close() throws IOException
    	 {
    	  System.err.println("close()");
    	 }
     
    	 public synchronized int available()
    	 {
    	  return count - pos;
    	 }	
    }
    Ensuite dans ma servlet j appelle mon bean et tout fonction bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    InputPhoto in = BPhoto.getPhotoPerso(3);
    		 request.setAttribute("ObjImg",in);
    		   getServletConfig().getServletContext().getRequestDispatcher("/DispImg.jsp").forward(request, response);
    Voila, j espere que ca aidera certaines personnes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Servlet][IO]Ecrire un File à partir d'un InputStream
    Par ravioli dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 04/02/2004, 10h15
  2. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13
  3. Réponses: 5
    Dernier message: 11/12/2003, 14h45
  4. Procédure stocké:Insert et renvoie de la clé primair
    Par caramel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2003, 09h34
  5. jointure renvois pas tous les enregistrements
    Par rayonx dans le forum Langage SQL
    Réponses: 7
    Dernier message: 29/08/2002, 12h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo