Введите @Resource в обычный класс - PullRequest
3 голосов
/ 08 декабря 2010

Я использую glassfish v3, где я создал сеанс JavaMail через консоль администратора. Я хочу использовать сеанс Почты так:

....
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);
        } 
    }
}

Когда я вызываю метод sendMixedMail, я вижу, что mailSession имеет значение null. Разве невозможно внедрить ресурс в обычный класс? И когда я говорю «нормально», я имею в виду класс, который не является управляемым бином или ejb-чем-то.

1 Ответ

5 голосов
/ 08 декабря 2010

Нет, вы не можете сделать это для обычного класса.Цитирование Страница внедрения J2EE SUN :

Имейте в виду, что контейнер платформы Java EE 5 может прозрачно обрабатывать инъекции только тогда, когда они используются в компонентах, управляемых контейнером, таких какОбработчики тегов EJB-компонентов, сервлетов и JavaServer Pages (JSP).

Это по двум причинам.Во-первых, из соображений производительности контейнер может ограничить поиск аннотаций только теми компонентами, которыми он управляет, которые определены в дескрипторе развертывания или доступны в определенных местах пути к классам.Во-вторых, контейнер должен иметь контроль над созданием компонента, чтобы иметь возможность прозрачно выполнять инъекцию в компонент.

...