В основном я пытаюсь внедрить bean-компонент @Stateless с локальным интерфейсом в класс, аннотированный с помощью @Named! Насколько я понимаю, инъекция возможна только тогда, когда точка инъекции управляется (имеет смысл), поэтому, например, было бы невозможно внедрить в POJO, но вы могли бы внедрить в сервлет, управляемый JSF или другой EJB.
Я бы подумал, что можно было бы впоследствии использовать его с @Named! Однако я получаю исключение NullPointerException, которое, по-видимому, подразумевает, что это на самом деле не кажется возможным!?
Мои классы выглядят так (раздеты для ясности);
@Named
public class EmailUtil {
// Logger-------------------------------------------------------------------
private static final Logger LOG = Logger.getLogger(EmailUtil.class.getName());
// Constructor--------------------------------------------------------------
public EmailUtil() {
}
// EJB----------------------------------------------------------------------
@EJB AuditDAO audit;
// Methods------------------------------------------------------------------
public void sendEmail(
String emailSender,
String emailRecipient,
String emailSubject,
String emailHtmlBody,
String emailTextBody) throws FailedEmailException {
... code removed for clarity ...
// Call Amazon SES to send the message
try {
new SES().getClient().sendEmail(request);
// Create an audit log of the event
audit.create("Email sent to " + emailSender);
} catch (AmazonClientException ace) {
LOG.log(Level.SEVERE, ace.getMessage(), ace);
throw new FailedEmailException();
} catch (Exception e) {
LOG.log(Level.SEVERE, e.getMessage(), e);
}
}
}
@Stateless
public class AuditDAOImpl implements AuditDAO {
// Logger-------------------------------------------------------------------
private static final Logger LOG = Logger.getLogger(AuditDAOImpl.class.getName());
// EntityManager------------------------------------------------------------
@PersistenceContext(unitName = "iConsultPU")
private EntityManager em;
@Override
public void create(String event) {
String subject;
try {
/*
* If the current subject has authenticated and created a session we
* want to register their ID. However it is possible that a subject
* does not have an ID so we want to set it to unknown.
*/
subject = SecurityUtils
.getSubject()
.getPrincipals()
.asList()
.get(1)
.toString();
} catch (Exception e) {
subject = "UNKNOWN";
}
Audit audit = new Audit();
audit.setUserId(subject);
audit.setEventTime(Calendar.getInstance());
audit.setEvent(event);
em.persist(audit);
}
}
@Local
public interface AuditDAO {
public void create(String event);
}
Я также пытался использовать @Inject, но это тоже не работает. Я неправильно понял спецификацию или просто плохо ее реализовал?