J'ai une classe de service qui n'est pas sérialisable et un haricot qui doit être sérialisé mais doit avoir accès à cette classe de service: ceci ne fonctionne évidemment pas parce que maintenant le Certainesbiennes code> ne sont plus sérialisables. Quelle est la bonne façon de résoudre ce problème au printemps? Lorsque je fais le champ code> usine code> transitoire, je perds l'instance d'usine injectée sur la désérialisation ou non? Et quand je fais le
STATFactory CODE> également sérialisable, cette classe ne sera plus un singleton, car chaque
anéanique code> d'une instance code> sera sa propre usine après la désérialisation alors. P> p>
4 Réponses :
peut-être avoir un évidemment, vous devez créer un setter pour quelque part -factoriel code>:
usine code> dans
en quelque usine code>. p> p>
La sériealisation et la désérialisation sont effectuées par le conteneur Web (l'instance des quelquebean est quelque part dans la session HTTP), donc je ne peux donc pas déléguer la désérialisation à une usine.
Java fournit un moyen de contrôler la sérialisation et la désérialisation en mettant en œuvre les deux méthodes: P>
Vidéo privé WriteObject (ObjectOutPutStream Out) jette IoException; Code> Li>
-
VOYAL PRIVATE READOBJEBJEUBJECT (ObjectInpuTream in) jette IoException, ClassNotFoundException; Code> Li>
ul>
Vous pouvez donc changer l'écriture pour stocker le haricon sans référence au service et plus tard, tout en lisant l'objet "injecter" la référence. p>
Mais comment puis-je obtenir l'instance code> STOFFactory CODE> dans la méthode code> lisaBject code> pour réinitialiser la dépendance? Cette dépendance est injectée automatiquement à la source lorsque le haricon est créé. Je n'ai pas de contexte d'application disponible dans la méthode ReadObject pour obtenir le haricot à partir de là. J'espérais que la magie du printemps manquait de cela.
@Kayahr: Voir ma réponse étendue
Mais un haricot de printemps ne connaît normalement pas le printemps du tout, ce n'est pas une bonne idée d'obtenir le contexte de l'application via une méthode statique. Lorsque je le fais, je peux simplement laisser tomber l'idée d'injection de dépendance entière et accéder au Stufffactory code> via une méthode statique
geInstance code> ou quelque chose comme ça.
Désolé mais stocker un haricot n'est pas une bonne idée du tout, vous devez donc faire du compromis. - Deuxièmement: cette déclaration "Spring haricot normalement ne connaît pas le printemps du tout" est peut-être vrai pour les haricots d'affaires, mais pas pour les composants d'infrastructure. Et ce que vous faites ici est de mélanger l'infrastructure dans un haricot d'affaires normal. - Quoi qu'il en soit, vous pouvez masquer cette forte dépendance / accès de ressort par annotation de la classe avec @configurable code>
@RRALPH: pour @configuré code> chargera le tissage de temps suffisant? Ou devra-t-il nécessiter le tissage de temps de compilation? Est-ce que le
en quelque sorte code> est toujours sérialisé quand oné?
@RoadRunner: 1) "Car @Configuré chargera du temps le tisser du temps?" Je ne suis pas sûr, mais je m'attends à ce que le tissage du temps de chargement du chapeau soit suffisant, mais je ne suis pas sûr. - Demandez simplement une nouvelle question au débordement de la pile. 2) Si vous "remplacer" wrdiolObject code> et
lisechject code> alors il devrait fonctionner.
Vous avez besoin d'une sorte de contexte pour cette magie em> travailler. Une manière laid, je peux penser est un code> ThreadLocal Code> Tenir le Mais le meilleur si vous pourriez extérioriser la logique qui nécessite le mise à jour: strong> p> le Point entier Dans une alternative ci-dessus à Si vous ne pourrez pas y parvenir, que le seul moyen utilise une sorte de Je viens de voir votre commentaire, que ApplicationContext < / Code> - C'est la manière dont la sécurité printanière utilise à l'aide de
SecurityContExtholder code>. p>
Stufffactory Stufffactory Code> à une sorte de singleton
quelquebeanservice code>, c'est-à-dire: p>
ThreadLocal Code> est de se débarrasser de la dépendance sur
Stufffactory code> à partir de
anbean code> complètement. Cela devrait être possible, mais nécessitera des changements d'architecture. La séparation des préoccupations EM> (une des règles non seulement du printemps, des règles de base) implique qu'il pourrait être une bonne idée de laisser
aneban code> être un simple objet de transfert de données < / EM> et la logique commerciale à déplacer vers la couche de service. p>
statique code> ( Comme Ralph a également dit). La mise en œuvre de ce contexte peut impliquer l'utilisation d'un
threadlocal code>. Cela permettrait d'accéder au
ApplicationContext Code> pour obtenir le
Stufffactory CODE>, mais c'est presque aussi moche que les variables globales, alors évitez-le si possible. P>
anbean code> est stocké dans la session HTTP et donc le problème de sérialisation / de désérialisation. Maintenant encore plus, je conseille de changer votre conception et de supprimer la dépendance. FAIRE
ONEBEAN CODE> Un DTO simple, aussi petit que possible pour éviter les sessions surchargées. Il ne devrait y avoir aucune logique nécessitant un accès à des haricots Singleton Springs à l'intérieur du
Oedebean code>. Cette logique doit être placée dans le contrôleur ou la couche de service. P> p>
Mais ensuite, je dois injecter cela en quelque tant que celui-ci. Ou voulez-vous dire y avoir accès sans printemps? Ensuite, cela est quelque peu similaire au modèle de délégatrice de service qui est normalement utilisé par des haricots non gérés. Mais mon anéanique code> est géré au printemps, alors j'espérais que le printemps a une magie de la gestion des dépendances transitoires. Eh bien, si aucune meilleure solution apparaît, je suppose que je dois accepter votre réponse.
Un re-pense à votre architecture est potentiellement pratique dans ce scénario. Si vous pouvez isoler les données qui doivent être sérialisées dans un objet de transfert de données simple (DTO), il doit donc être possible de fournir une enveloppe à ce que DTO peut contenir des dépendances à d'autres haricons.
Par exemple: p> désolé pour tout le code! Cependant, laissez-moi essayer d'expliquer ce que je veux dire ici. Si vous récupérez toujours le haricot de session via un service (dans ce cas Someservice), vous avez la possibilité de créer une enveloppe autour du haricot de session. Ce wrapper peut contenir toutes les dépendances de haricot (autonomes à Someservice) que vous souhaiteriez peut-être utiliser dans le cadre de la logique de la session à côté du haricot de session. P> La chose nette à propos de cette approche est que vous pouvez programmer à une interface bien (voir idatabéen). Cela signifie que, si vous, par exemple, avait un contrôleur qui obtient le haricot de données du service, il effectue des tests d'unité / moqueurs très propres. P> éventuellement, une approche encore plus propre du point de vue du code, Être pour MyDataBeanwithDePendance d'être enregistré dans le conteneur de printemps à l'aide de la portée "Demande". Donc, vous pourriez simplement modifier ce haricot directement dans un service de service. Cela traiterait essentiellement de manière transparente l'instanciation afin de ne pas avoir besoin d'instancier manuellement MyDataBeanWithDePendance de l'intérieur du service. P> J'espère que j'ai fait assez pour m'expliquer ici! P> P>