2010-12-08 5 views
3

J'utilise glassfish v3 où j'ai créé une session JavaMail via la console d'administration. Je veux utiliser la session Mail comme ceci:Injecter @Resource dans la classe normale

.... 
import javax.annotation.Resource; 
import javax.mail.*; 
import javax.mail.internet.*; 

public class Mailer { 

    MailGenerator mailGenerator; 
    @Resource(name = "mail/WMCMail") 
    private Session mailSession; 

    public Mailer(MailGenerator mailGenerator) { 
     this.mailGenerator = mailGenerator; 
    } 

    public void sendMixedMail(String recipient, String subject) { 
     try { 
      Message message = new MimeMessage(mailSession); 

      message.setRecipients(
       Message.RecipientType.TO, 
       InternetAddress.parse(recipient, false)); 
      message.setSubject(subject); 

      ...... 

      Transport.send(message); 

      logger.log(Level.INFO, "Mail sent to {0}.", recipient); 
     } catch (MessagingException ex) { 
      logger.log(Level.SEVERE, "Error in sending email to " + recipient, ex); 
     } 
    } 
} 

Quand j'appelle la méthode sendMixedMail je vois que la mailSession est nulle. Est-il impossible d'injecter une ressource dans une classe normale? Et quand je dis normal, je veux dire une classe qui n'est pas un haricot géré ou un ejb-quelque chose.

Répondre

5

Non, vous ne pouvez pas faire cela pour une classe normale. Je cite SUN's J2EE injection page:

Gardez à l'esprit qu'un conteneur Java EE 5 plate-forme peut gérer les injections transparente seulement quand ils sont utilisés sur les composants gérés par conteneur, tels comme les haricots EJB, Servlets et JavaServer Gestionnaires de balises technologiques Pages (JSP).

Ceci pour deux raisons. Tout d'abord, pour considérations de performance, un conteneur peut restreindre sa recherche d'annotations uniquement aux composants qu'il gère, qui sont définis dans un descripteur de déploiement ou sont accessibles dans classpath spécifiques emplacements. Deuxièmement, le conteneur doit avoir le contrôle sur la création du composant pour pouvoir effectuer de façon transparente l'injection dans le composant .

Questions connexes