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

Services Web Java Discussion :

Utiliser un type enum(jdk5) avec Axis


Sujet :

Services Web Java

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Utiliser un type enum(jdk5) avec Axis
    Bonjour,

    Je souhaite utiliser les enumeration telles que definit dans le JDK 5 dans AXIS. Plus precisement un des type de retour de mon appel comprend un champ de type enum :
    // par exemple
    public enum CategorieContrat {
    INDIVIDUEL,COLLECTIF;
    }

    Simplement au moment de la deserialisation Axis n'arrive pas a creer une instance de l'enum (car une enum n'a pas de constructeur par defaut public)
    j'ai fait l'essai avec : EnumDeserializerFactory

    Si j'utilise BeanDeserializerFactory j'obtient un nullpointerexception.

    Quelle est la bonne maniere d'enregistrer un parametre de type enum en Axis (j'utilise Axis 1.4)
    merci
    d'avance

  2. #2
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut une solution!
    Ca y est j'ai trouve une solution :
    J'ai implemente mon propre deserializer. Je le donne ici si ca peut aider quelqu'un.
    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
     
    import javax.xml.namespace.QName;
     
    import org.apache.axis.encoding.ser.BaseDeserializerFactory;
    /**
     * DeserializerFactory for Enumeration.
     *
     */
    @SuppressWarnings("serial")
    public class EnumDeserializerFactory extends BaseDeserializerFactory {
     
    	public EnumDeserializerFactory(Class javaType, QName xmlType) {
            super(EnumDeserializer.class, xmlType, javaType);  // Can't share deserializers
        }
    }
    voila le coeur de la reponse :
    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
     
    /**
     * Deserializer for a jdk5 enum.
     *
     */
    public class EnumDeserializer extends SimpleDeserializer{
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
    	public EnumDeserializer(Class javaType, QName xmlType) {
    		super(javaType, xmlType);
    	}
     
    	@SuppressWarnings("unchecked")
    	public Object makeValue(String source) throws Exception
    	{
    		// Invoke the fromString static method to get the Enumeration value
    		if (isNil)
    			return null;
    		return Enum.valueOf(javaType, source);
    	}
     
    }

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 36
    Points : 28
    Points
    28
    Par défaut Comment faire son propre deserilizer
    Bonjour,

    j'ai un type particulier de donnée et j'aimerai bien faire mon propre deserializer

    je pense faire à peu prêt la meme chose que toi, pourtant j'ai une erreur du type : org.xml.sax.SAXException: Deserializing parameter 'a': could not find deserializer for type {http://www.w3.org/2001/XMLSchema}truc

    je ne comprends pas trop ou je dois spécifier que mon deserializer est utilisé pour le type "truc" (exemple de test...)

    ???

  4. #4
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Moi je le fait dans le .wsdd

    <typeMapping xmlns:ns="EXTHV"
    qname="ns:monpackage.TypePOJO"
    type="java:monpackage.TypePOJO"
    serializer="org.apache.axis.encoding.ser.EnumSerializerFactory"
    deserializer="monpackage.EnumDeserializerFactory"
    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Salut,

    Deux après, ton code sert toujours et ça c'est cool.
    Mais j'ai une question, enfin, disons tout simplement que je n'arrive pas à le faire marcher, j'ai toujours un NullPointerException...

    Je fais bien ce que tu as dit, mais rien n'y fait. Le Deserializer est bien appelé (j'ai mis un syso) et j'ai bien paramétré mon server-config.wsdl.

    Y a t-il quelque chose de plus à faire ? A paramétrer ? A changer dans ton code ? D'ailleurs, je ne comprends pas tout à fait ce que le code fait de différent que les superClasses...

    J'espère que tu pourras m'aider.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Evidemment, j'avais écrit n'importe quoi.

    En fait dans la classe EnumDeserializerFactory, je faisais un import de la classe EnumDeserializer officielle et non celle de mon projet. Depuis l'import enlevé, ça fonctionne Nicquel !

    Encore Merci.

  7. #7
    Membre à l'essai
    Profil pro
    CTO
    Inscrit en
    Mars 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : CTO

    Informations forums :
    Inscription : Mars 2003
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    J'ai bien lu les posts précédents , j'ai aussi bien lu la documentation "WhenBeansAreNotEnoughCustomSerialization" sur le site Apache et j'ai exploré l'exemple "sample/encoding" livré dans les sources d'Axis 1.4.

    Pour autant j'ai toujours l'interrogation suivante : Comment exprimer le "typeMapping" (cf. tag dans le wsdd) dans le source Java pour lier mon "enum" à mes "custom" sérialiseur et désérialiseur ?

    Mon mode opératoire est de n'avoir que mes sources classes Java à maintenir en utilisant l'outil d'Axis " java2WSDL" avec l'option "-d" pour générer le wsdd et le wsdl (cf. je qualifie ce dernier avec soapui )

    Merci d'avance.

    Olivier

    P.S. j'ai trouvé pas mal d'informations dans la liste "axis-user", mais pas ma réponse....

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

Discussions similaires

  1. Service Web avec Axis et types complexes.
    Par Skyman37 dans le forum Services Web
    Réponses: 17
    Dernier message: 13/01/2011, 09h28
  2. [java 5]utiliser un type enum en paramètres
    Par MicroPuce dans le forum Langage
    Réponses: 3
    Dernier message: 15/03/2007, 11h52
  3. Réponses: 5
    Dernier message: 10/03/2007, 21h45
  4. [Axis] Utilisation d'un service soap avec Axis.
    Par avalone dans le forum Services Web
    Réponses: 3
    Dernier message: 14/02/2006, 15h17
  5. [VB.NET] Variable de type enum avec du string
    Par Mouse dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/01/2005, 18h22

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