0

我基本上是在尝试将具有本地接口的@Stateless bean 注入使用@Named 注释的类中!我的理解是,只有在管理注入点时才可能进行注入(非常有意义),因此例如无法注入 POJO,但您可以注入 Servlet、托管 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,但这似乎也不起作用。我是否误解了规范或只是实施不当?

4

2 回答 2

1

您应该注入您的依赖项。因此,如果您EmailUtil是手动构建的,则注入将不起作用。它需要容器管理。因此,如果您使用 servlet 或任何托管 bean,则可以@Inject。CDI 注入仅适用于托管对象。

您可以做一些额外的工作,例如针对构造的实例手动调用它。看看这个问题的例子:Parallel webservices access in a Weld CDI environment

于 2013-06-23T15:32:19.380 回答
0

您的 beans.xml 是否位于正确的位置?@Named(和其他 CDI bean)的注入由 CDI 处理,除非 beans.xml 文件位于正确的位置(战争的 WEB-INF 和 jar 的 META-INF),否则不会启动。

于 2013-06-21T16:35:34.223 回答