2010-07-30 8 views
37

Je reçois ces messages:Le bean backing JSF doit être sérialisable?

[# | 2010-07-30T11: 28: 32,723 + 0000 | AVERTISSEMENT | glassfish3.0.1 | javax.faces | _ThreadID = 37; _ThreadName = Discussion-1; | Réglage valeur d'attribut non sérialisable dans viewmap: (clé: MyBackingBean, valeur classe: foo.bar.org.jsf.MyBackingBean) | #]

Est-ce que ceux-ci signifient que mes grains de support JSF devrait mettre en œuvre Serializable? Ou se réfèrent-ils à un autre problème?

Répondre

58

Oui, vous l'avez bien compris. La vue est essentiellement stockée dans la portée de la session. La portée de la session est en JSF, sauvegardée par le HttpSession de la servlet. Tous les attributs de session sont censés implémenter Serializable, ceci parce que le servletcontainer moyen peut conserver les données de session sur le disque dur entre autres pour pouvoir partager avec d'autres serveurs dans un cluster ou survivre à une charge importante ou pour relancer des sessions pendant le redémarrage du serveur.

Le stockage d'objets Java bruts sur le disque dur n'est possible que si la classe respective implémente Serializable. Ensuite, ObjectOutputStream peut être utilisé pour les écrire sur le disque dur et ObjectInputStream pour les lire depuis le disque dur. Le servletcontainer gère tout cela de manière transparente, vous n'avez pas besoin de vous en préoccuper. JSF donne juste un avertissement pour que vous compreniez les risques.

+0

Mes haricots sont principalement visibles. Sont-ils également persistés lorsque la session est persistée? – egbokul

+3

Comme indiqué, la vue est stockée dans la session. – BalusC

+0

Désolé, relisez votre réponse à nouveau ;-) – egbokul

0

Les beans qui utilisent une portée de session, d'application ou de conversation doivent être sérialisables, mais les beans utilisant la portée de requête ne doivent pas nécessairement être sérialisables. Source: https://docs.oracle.com/javaee/6/tutorial/doc/gjbbk.html

+0

Remarque importante: Cette section concerne les beans gérés par CDI et non les beans gérés par JSF. – BalusC

+1

Pourriez-vous élaborer davantage votre réponse en ajoutant un peu plus de détails sur la solution que vous fournissez? – abarisone

-2

Oui, Beans Sauvegarde/haricots gérés sont essentiellement destinés à conserver l'état de la vue, il devrait donc être mis en œuvre sérialisation, mais l'interface utilisateur des composants peut ne pas permettre de sérializable et JSF Runitime vous montrer errror/message d'alerte. Une chose que vous pouvez faire est de marquer un tel composant transitoire dans vos MBeans.

Merci.

+1

Cela ne s'applique pas aux beans gérés JSF de portée ou de demande. En ce qui concerne les composants de l'interface utilisateur, vous ne devez jamais affecter un composant de l'interface utilisateur en tant que variable d'instance d'un bean géré dans une étendue plus large que la portée de la demande. Ce faisant, c'est simplement un mauvais design. Voir aussi a.o. http://stackoverflow.com/questions/14911158/ – BalusC

Questions connexes