7
votes

Injection de dépendance du ressort dans des haricots sérialisables

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: xxx

ceci ne fonctionne évidemment pas parce que maintenant le Certainesbiennes ne sont plus sérialisables. Quelle est la bonne façon de résoudre ce problème au printemps? Lorsque je fais le champ usine transitoire, je perds l'instance d'usine injectée sur la désérialisation ou non? Et quand je fais le STATFactory également sérialisable, cette classe ne sera plus un singleton, car chaque anéanique d'une instance sera sa propre usine après la désérialisation alors.


0 commentaires

4 Réponses :


0
votes

peut-être avoir un quelque part -factoriel : xxx

évidemment, vous devez créer un setter pour usine dans en quelque usine .


1 commentaires

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.



1
votes

Java fournit un moyen de contrôler la sérialisation et la désérialisation en mettant en œuvre les deux méthodes:


6 commentaires

Mais comment puis-je obtenir l'instance STOFFactory dans la méthode lisaBject 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 via une méthode statique geInstance 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


@RRALPH: pour @configuré 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 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 et lisechject alors il devrait fonctionner.



2
votes

Vous avez besoin d'une sorte de contexte pour cette magie travailler.

Une manière laid, je peux penser est un ThreadLocal Tenir le ApplicationContext < / Code> - C'est la manière dont la sécurité printanière utilise à l'aide de SecurityContExtholder .

Mais le meilleur si vous pourriez extérioriser la logique qui nécessite le Stufffactory à une sorte de singleton quelquebeanservice , c'est-à-dire: xxx

mise à jour:

le Point entier Dans une alternative ci-dessus à ThreadLocal est de se débarrasser de la dépendance sur Stufffactory à partir de anbean complètement. Cela devrait être possible, mais nécessitera des changements d'architecture. La séparation des préoccupations (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 être un simple objet de transfert de données < / EM> et la logique commerciale à déplacer vers la couche de service.

Si vous ne pourrez pas y parvenir, que le seul moyen utilise une sorte de statique ( Comme Ralph a également dit). La mise en œuvre de ce contexte peut impliquer l'utilisation d'un threadlocal . Cela permettrait d'accéder au ApplicationContext pour obtenir le Stufffactory , mais c'est presque aussi moche que les variables globales, alors évitez-le si possible.

Mise à jour2:

Je viens de voir votre commentaire, que anbean 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 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 . Cette logique doit être placée dans le contrôleur ou la couche de service.


1 commentaires

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 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.



0
votes

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: xxx

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.

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.

é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.

J'espère que j'ai fait assez pour m'expliquer ici!


0 commentaires