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

Flex Discussion :

Conversion d'objet avec BlazeDS


Sujet :

Flex

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 68
    Par défaut Conversion d'objet avec BlazeDS
    Bonjour à tous !

    Alors voilà mon problème avec BlazeDS et le RemoteObject de Flex :

    Lorsque je récupère directement un objet de classe Adresse de Java vers AS3, je n'ai pas de problème de conversion.

    Code xml : 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
     
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
     
     
    <mx:RemoteObject id="ro" destination="AdresseManager"
    				 result="resultHandler(event)"
    				 fault="faultHandler(event)" />
     
     
    <mx:Script>
    	<![CDATA[
    		import valueObjects.Client;
    		import valueObjects.Adresse;
     
    		import mx.controls.Alert;
    		import mx.rpc.events.FaultEvent;
    		import mx.rpc.events.ResultEvent;
     
     
    		[Bindable]
    		public var addr:Adresse;
    		[Bindable]
    		public var cl:Client;
     
    		private function faultHandler(event:FaultEvent):void{
    			Alert.show(event.fault.faultString);
    		}
     
    		private function resultHandler(event:ResultEvent):void{
    			if (event.result == null)
    				Alert.show("Failed");
    			else{
    				Alert.show("Success");				
    				addr = event.result as Adresse;
     
    			}
    		}
     
     
    	]]>
    </mx:Script>
     
    <mx:Button label="Get Data" click="ro.getAdresseById(1)"/>
     
    <mx:Label text="{addr.bp} {addr.nomVoie} {addr.lieuDit}" />
     
     
    </mx:Application>
    Ce code m'affiche bien les propriétés de l'adresse.

    Ensuite j'ai une classe Client qui contient une variable adresse de type Adresse.

    Le problème est que lorsque je récupère un objet de la classe Client (toujours de Java vers AS3), la conversion de l'objet Adresse sur la variable adresse se passe mal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: Error #1034: Echec de la contrainte de type*: conversion de Object@15465b29 en valueObjects.Adresse impossible.
    Ce qui m'énerve le plus, c'est que "desfois" ça fonctionne mais très rarement et peut être dû à un problème de cache ...

    Voilà, je n'ai plus qu'à espérer que quelqu'un est déjà passé par là (où croire au père noël ). Donc si quelqu'un a une idée ?
    Merci d'avance.

    Joyeux noël à tous !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 78
    Par défaut
    As tu bien stipulé tes remote alias coté flex (et java) tes remote class alias

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 68
    Par défaut
    Oui je les ai bien fait du coté flex :

    Code AS3 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    package valueObjects
    {
    	import mx.collections.ArrayCollection;
     
    	[RemoteClass(alias="fr.data.Client")]		
     
    	[Bindable]
    	public class Client
    	{...}
    }

    Code AS3 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    package valueObjects
    {
    	import mx.collections.ArrayCollection;
     
    	[RemoteClass(alias="fr.data.Adresse")]
     
    	[Bindable]
    	public class Adresse
    	{...}
    }

    dans le remoting-config.xml
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	<destination id="ClientManager">
    		<properties>
    			<source>fr.service.ClientManager</source>
    			<scope>application</scope>
    		</properties>
    	</destination>
     
    	<destination id="AdresseManager">
    		<properties>
    			<source>fr.service.AdresseManager</source>
    			<scope>application</scope>
    		</properties>
    	</destination>

    Qu'entends tu par "coté java" ?

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 68
    Par défaut
    Personne ?

    je joins les classes au cas ou :

    Adresse :
    Code Java : 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
     
    public class Adresse implements java.io.Serializable {
     
    	private Integer idAdresse;
    	private Integer NVoie;
    	private String typeVoie;
    	private String nomVoie;
    	private String lieuDit;
    	private Integer cp;
    	private String commune;
    	private Integer bp;
    	private String pays;
    	private Set clientsForIdAdresse = new HashSet(0);
    	private Set clientsForIdAdresseChantier = new HashSet(0);
     
    	public Adresse() {
     
    	}
    }

    Code ActionScript : 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
     
    	[Bindable]
    	[RemoteClass(alias="fr.data.Adresse")]
    	public class Adresse
    	{
     
    		public var idAdresse:int;
    		public var NVoie:int;
    		public var typeVoie:String;
    		public var nomVoie:String;
    		public var lieuDit:String;
    		public var cp:int;
    		public var commune:String;
    		public var bp:int;
    		public var pays:String;
    		public var clientsForIdAdresse:Object;
    		public var clientsForIdAdresseChantier:Object;	
     
    	}

    Client :
    Code Java : 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
     
    public class Client implements java.io.Serializable {
     
    	private Integer idClient;
    	private Adresse adresseByIdAdresseChantier;
    	private Adresse adresseByIdAdresse;
    	private String nom;
    	private String prenom;
    	private String telephone;
    	private String mail;
    	private Set ficheValidations = new HashSet(0);
    	private Set dossiers = new HashSet(0);
     
    	public Client() {
    	}
    }

    Code ActionScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    	[Bindable]
    	[RemoteClass(alias="fr.data.Client")]		
    	public class Client
    	{
    		public var idClient:int;
    		public var adresseByIdAdresseChantier:Adresse;
    		public var adresseByIdAdresse:Adresse;		
    		public var nom:String;
    		public var prenom:String;
    		public var telephone:String;
    		public var mail:String;
    		public var ficheValidations:ArrayCollection;
    		public var dossiers:ArrayCollection;
    	}

    Voilà, donc comme précédemment dit, la classe Client comporte des attributs de type Adresse.
    Je ne comprends vraiment pas pourquoi, une adresse toute seule est bien convertie, alors qu'une adresse dans un objet client devient null.

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 68
    Par défaut
    Je reviens à la charge :p

    Juste pour dire que si je ne caste pas les objets provenant de Java en objet typé AS, BlazeDS convertit ces objets en ... Object et je peux tout de même accéder aux propriétés de ces objets ...
    Voilà c'est moche, mais ça "marche".

    Je suis toujours ouvert à d'éventuelles autres solutions !!

    Merci

  6. #6
    Inactif
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 117
    Par défaut
    normalement dans le remoteClass que tu déclares dans ta classe AS3 correspond au package + classe java

    [RemoteClass(alias="fr.data.Adresse")]
    donc normalement au niveau java ta classe Adresse doit etre dans un package data qui lui meme est dans un package fr.

    Si ça ne marche pas, là il y a un autre gros problème

  7. #7
    Invité de passage
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1
    Par défaut
    Le problème vient du fait que le compilateur embarque uniquement les classes qui sont utilisées dans l'application or quand on aime l'abstraction, on est souvent amené dans ce cas de figure.
    Lorsque BlazeDS dé-sérialise l'objet provenant du serveur, l'application ne peut pas interpréter l'objet sous son type réel.

    La solution que j'utilise consiste à créer une classe avec des attributs statiques représentant chacune des classes dotés du metadata tag [RemoteClass], et dont le constructeur créé une instance vide de chacun de ces attributs.
    Dans mon application je fais appelle une seule fois à cette classe, plus précisément à son constructeur, ce qui impose au compilateur d'embarquer mes classes.

    Nous sommes d'accord, c'est horrible.

    En creusant un peu, je suis tombé sur une option de compilation includes class qui selon le site d'adobe permettrait d'indiquer explicitement au compilateur qu'il doit embarquer certaines classes dans le swf qu'elles soient utilisées ou non. Une autre option include-libraries permettrait de faire la même opération avec une librairie (swc) complète. Les remote classes devraient alors être implémentés dans une librairie à part et serait alors importé à la compilation via cette option compilo.

    Je n'ai pas encore testé ces fonctionnalités de compilation, mais il semblerait que la bonne pratique se situe plutôt avec ceci. Je testerais prochainement, je posterais pour vous tenir informé.

Discussions similaires

  1. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 13h44
  2. Réponses: 9
    Dernier message: 22/12/2005, 22h20
  3. Réponses: 3
    Dernier message: 22/12/2005, 00h40
  4. nommer un objet avec une variable
    Par fatcat dans le forum C++
    Réponses: 4
    Dernier message: 11/12/2005, 16h16
  5. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22

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