Comment injecter un non-classe sérialisable (comme java.util.ResourceBundle) avec Soudure
Je veux créer un Producteur qui le rend possible d'injecter un java.util.ResourceBundle dans l'une des classes afin d'obtenir les Chaînes localisées facilement. Mon ResourceBundle-Producteur ressemble à ceci:
public class ResourceBundleProducer {
@Inject
public Locale locale;
@Inject
public FacesContext facesContext;
@Produces
public ResourceBundle getResourceBundle() {
return ResourceBundle.getBundle("/messages", locale )
}
}
L'Injection de paramètres Régionaux et FacesContext fonctionne (j'ai pris le correspondant pour les producteurs de la Couture 3 Source Alpha). Mais malheureusement, ResourceBundle n'est pas Sérialisable et, par conséquent, ne peuvent pas être produites de cette façon. J'obtiens l'Erreur suivante à partir de Soudure lorsque vous essayez d'accéder à un JSF-page qui appelle un haricot qui utilise mon ResourceBundle:
Caused by: org.jboss.weld.IllegalProductException: WELD-000054 Producers cannot produce non-serializable instances for injection into non-transient fields of passivating beans\\n\\nProducer\: org.jboss.weld.bean-/D:/Program Files (x86)/GlassFish-Tools-Bundle-For-Eclipse-1.2/glassfishv3/glassfish/domains/teachernews/applications/teachernews/-ProducerMethod-services.producers.ResourceBundleProducer.getResourceBundle()\\nInjection Point\: field web.PersonHome.bundle
Est-il possible d'obtenir mon ResourceBundleResolver de travail? Ou existe-il d'autres mécanismes pour obtenir une fonctionnalité similaire?
Merci à l'avance!
EDIT:
Bon, je vais passé une partie de ma peine le nombre de points gagnés 😉
Acceptera également une bonne solution de contournement pour ce problème!
J'ai reçu un autre exemple où la création d'un Producteur ne fonctionne pas: un FlashProducer. Un FacesContext-Flash ne peut pas être produit parce que Flash n'est pas sérialisable.
Vous devez vous connecter pour publier un commentaire.
Bien, tout d'Abord ResourceBundle n'est pas Sérialisable. Voir ici. Et Le message est clair
la passivation de haricots ??? Je Pense que web.PersonHome est un Stateful Session Bean ou un @ConversationScoped bean. Suis-je le droit ??? Si donc vous devriez marque de votre bundle propriété transitoire
bundle
marqué commetransient
, comment pouvez-vous être sûr qu'il est disponible lorsque vous en avez besoin? En cas de passivation/activation de la fève, laResourceBundle
est parti et l'accès à il serait rais une exception.transient
résout l'exception encore, mais je suis arriver un triangle d'avertissement sur les dépendances non satisfaites. Monbeans.xml
abean-discovery-mode="all"
dans les deux projets (où le@Cached
annotation et producteur de la classe et où le@Cached
est@Inject
), mais encore sur les deux côtés, je suis, comme pour@Inject private CacheManager manager;
. Des idées?Que par les commentaires de thread dans la accepté de répondre à d'Arthur. J'ai suivi ce blog ainsi que cette une de réaliser une passivation/activation de l'expérience. L'expérience a prouvé MrD commentaire que le passage de la propriété sera NULLE au moment de l'activation. Ainsi, pour faire face à la non-sérialisable membre propriétés de passivation capable de haricots (à savoir, sessionscoped, conversationscoped et stateful session beans), je propose la solution suivante:
Cette solution permet de s'assurer que la non-sérialisable les membres de la propriété sont réinitialisés à chaque fois qu'il entre dans l'état PRÊT.
Un dernier problème à résoudre
Un dernier point à aborder est l'injection d'un SLF4j Enregistreur qui était non sérialisable avant de slf4j 1.5.3, et Je cite:
Ainsi, aussi longtemps que votre slf4j dépendance est 1.5.3 ou tard, vous pouvez en toute sécurité injecter un SLF4j Enregistreur comme suit:
En supposant que vous avez déclaré le qualifier:
Puis dans une passivation capable de haricot, injecter comme suit:
ResourceBundle
: si je comprends bien, vous êtes pas à l'aide d'un producteur pour laResourceBundle
plus - perdre le charme de CDI. Au lieu de cela, vous obtenez laResourceBundle
manuellement sur PostConstruct et -Activer les événements (btw: le PostConstruct et Activer des méthodes ne DOIT PAS retourner de valeur). Donc, c'est complètement non-CDI solution qui pourrait avoir été utilisé dans JEE5 trop, n'est-ce pas?