Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comportement de java avec les Beans

1 réponse
Avatar
Wamli
Salut à tous,

J'essaye d'utiliser le package bean et d'écrire mes classes en respectant
les conventions. Mais :

J'ai une classe qui contient un champ "int id". Ce champ est extremement
important, il doit être unique et consistant. Il est attribué non à la
création de l'objet mais quand l'objet est ensuite placé dans une
collection. Son id ne peut être défini qu'une fois, un méchanisme de blocage
empèche plus d'une modification (c.a.d toute autre modification que
l'assignation). De plus, pour éviter les suprises, id est par défaut
initialisé à -1. Lorsqu'ensuite la méthode getIndex() est appelée, elle
lance une exception si id est toujours négatif (car l'index n'a pas encore
été fixé et donc il y a une erreur quelque part, un objet de cette classe ne
pouvant être "flottant", il doit faire partie d'une collection et donc avoir
un index).

Tout marchait très bien jusqu'à aujourd'hui, mais là j'aimerais utiliser les
beans et surtout le XMLEncoder qui permet facilement de sérialiser en XML un
bean. Le problème, c'est que la propriété "id" n'apparait pas, malgré la
présence de methodes get et set. Après une petite heure de jeu avec le
débuggeur, j'ai remarqué que ce XMLEncoder, ou plutot le
java.beans.PersistenceDelegate, avant de sérialiser l'objet donné, crée un
objet du même type, et ensuite appelle une à une les méthodes get et set de
cette classe pour savoir lesquelles sont valables. Donc, dans mon cas, il
crée un objet de la classe, qui se retrouve avec id=-1 et juste après il
balance "getIndex". getIndex() retourne une exception, donc XMLEncoder
disqualifie la propriété et résultat final, la valeur "id" n'apparait pas
dans le texte XML.

Alors évidemment, je pourrais supprimer cette sécurité de -1, mais je
voulais surtout savoir si dans mon cas cela rime toujours à quelque chose
d'utiliser ce package bean. Mon objet n'est-il pas trop sophisitiqué ? Ou
alors n'y a-t-il pas moyen d'empecher cette intrusion de java dans les
classes... ou dois-je écrire mon propre encodeurXML, en utilisant juste les
beans pour sortir les méthode get et set de la classe ?

merci pour vos lumières !

1 réponse

Avatar
Hervé AGNOUX
Wamli wrote:


Tout marchait très bien jusqu'à aujourd'hui, mais là j'aimerais utiliser
les beans et surtout le XMLEncoder qui permet facilement de sérialiser en
XML un bean. Le problème, c'est que la propriété "id" n'apparait pas,
malgré la présence de methodes get et set. Après une petite heure de jeu
avec le débuggeur, j'ai remarqué que ce XMLEncoder, ou plutot le
java.beans.PersistenceDelegate, avant de sérialiser l'objet donné, crée un
objet du même type, et ensuite appelle une à une les méthodes get et set
de
cette classe pour savoir lesquelles sont valables. Donc, dans mon cas, il
crée un objet de la classe, qui se retrouve avec id=-1 et juste après il
balance "getIndex". getIndex() retourne une exception, donc XMLEncoder
disqualifie la propriété et résultat final, la valeur "id" n'apparait pas
dans le texte XML.



A ce que j'ai compris, XMLEncoder considère que les propriétés d'un bean ont
des valeurs implicites, qui ne sont pas mémorisées, pour économiser de la
place. Ces valeurs implicites sont trouvées sur un bean juste construit.

Avec ta mise en oeuvre, il n'y a pas de valeur implicite, mais seulement une
valeur non initialisée.

As-tu essayé voir ce que cela donne sur un de tes beans où tu aurais
initialisé cette valeur "id" ? Avec un peu de chance, comme elle est
différente de la valeur par défaut, cela fonctionne.

Sinon, consulte "Using
XMLEncoder" (http://java.sun.com/products/jfc/tsc/articles/persistence4/)
où ils donnent des infos pour traiter les exceptions lors de l'encodage ;
peut être que cela convient à ton cas. Sinon encore, cette page te donnera
peut être quelques autres idées...



--
Hervé AGNOUX
http://www.diaam-informatique.com