Dependency injection 消息驱动bean(MDB)中未注入无状态EJB
我有一个实现MessageListener的消息驱动bean(MessageDrivenBean,MDB),它有几个EJB属性,但没有一个被注入,所以我必须手动注入它们。MDB还有一个资源和一个CDIBean,可以很好地注入 为什么EJB不是自动注入的?我在应用程序的其他部分使用NotificationServiceEJB,它们被注入。关于如何解决这个问题有什么线索吗 我没有从Weblogic 12.1.3中得到任何错误,因此我无法理解这里发生了什么。我的代码是(出于调试目的,充满了跟踪)。我已经删除了与问题无关的javadocs和方法实现:Dependency injection 消息驱动bean(MDB)中未注入无状态EJB,dependency-injection,java-ee-6,ejb-3.1,weblogic12c,message-driven-bean,Dependency Injection,Java Ee 6,Ejb 3.1,Weblogic12c,Message Driven Bean,我有一个实现MessageListener的消息驱动bean(MessageDrivenBean,MDB),它有几个EJB属性,但没有一个被注入,所以我必须手动注入它们。MDB还有一个资源和一个CDIBean,可以很好地注入 为什么EJB不是自动注入的?我在应用程序的其他部分使用NotificationServiceEJB,它们被注入。关于如何解决这个问题有什么线索吗 我没有从Weblogic 12.1.3中得到任何错误,因此我无法理解这里发生了什么。我的代码是(出于调试目的,充满了跟踪)。我已
@MessageDriven(name = "MailMessageConsumer", description = "JMS consumer", mappedName = MailJndiConfiguration.JNDI_QUEUE,
activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode",
propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Queue")
})
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@MessageReceiver(responsibility = "Consumes JMS messages of type MailMessage")
public class MailMessageConsumer implements MessageListener {
private static final Logger log = LoggerFactory.getLogger(MailMessageConsumer.class);
@Resource
private MessageDrivenContext messageDrivenContext;
@EJB
private NotificationService notificationService;
@EJB
private MailClient mailClient;
@Inject
private ApplicationInformation applicationInformation;
@Override
public void onMessage(Message message) {
if (mailClient == null) {
log.error("mailClient object is null");
try {
log.info("Instantiating MailClient manually...");
mailClient = BeanManagerHelper.getReference(MailClient.class);
} catch (Exception e) {
log.error("Cannot instantiate MailClient manually", e);
}
}
if (notificationService == null) {
log.error("notificationService object is null");
try {
log.info("Instantiating NotificationService manually...");
notificationService = BeanManagerHelper.getReference(NotificationService.class);
} catch (Exception e) {
log.error("Cannot instantiate NotificationService manually", e);
}
}
// This never happens
if (applicationInformation == null) {
log.error("applicationInformation object is null");
}
// This never happens
if (messageDrivenContext == null) {
log.error("messageDrivenContext object is null");
}
deliverMessage(message);
}
private void deliverMessage(Message message) {
// Not important
}
private MailMessage retrieveMessage(Message message) {
// Not important
}
private void sendEmail(MailMessage mailMessage) {
// Not important
}
}
MailClient EJB:
@Stateless
@LocalBean
@TransactionAttribute(TransactionAttributeType.MANDATORY)
@Service
public class MailClient {
private static final Logger logger = LoggerFactory.getLogger(MailClient.class);
@Resource(mappedName = MailJndiConfiguration.JNDI_MAIL_SESSION)
private Session mailSession;
@EJB
private NotificationService notificationService;
@Inject
private ApplicationInformation applicationInformation;
enum ValidationError {
NULL_OBJECT("Mail message is null"),
CONTENT_TYPE_EMPTY("Content type not initialized"),
BODY_EMPTY("Message body content is empty");
private static final String ERROR_MESSAGE_PREFIX = "Invalid mail message: ";
private String message = ERROR_MESSAGE_PREFIX;
ValidationError(String message) {
this.message += message;
}
public String getMessage() {
return message;
}
}
public void sendMail(MailMessage mailMessage) throws MailMessageSendingException {
// Not important
}
}
NotificationService EJB:
@Stateless
@LocalBean
@TransactionAttribute(TransactionAttributeType.MANDATORY)
@Service
public class NotificationService {
private static final Logger logger = LoggerFactory.getLogger(NotificationService.class);
@PersistenceContext(unitName = "myEntityManager")
private EntityManager entityManager;
@EJB
private NotificationPendingMessageValidator notificationPendingMessageValidator;
@EJB
private NotificationFinder notificationFinder;
@Inject
private ApplicationInformation applicationInformation;
public NotificationPendingMessageEntity saveNotificationMessageForDeferredMail(NotificationPendingMessageEntity notificationPendingMessageEntity) throws ValidationException {
// Not important
}
public List<NotificationPendingMessageEntity> findNotificationPendingMessageEntities(TimeSlot timeSlot) {
// Not important
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public NotificationMailEntity createNewMailEntity() {
// Not important
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void updateMailEntity(NotificationMailEntity mailEntity) {
// Not important
}
public void createNotificationMessageProcessedEntity(NotificationProcessedMessageEntity notificationProcessedMessageEntity) {
// Not important
}
public void removeNotificationMessagePendingEntity(NotificationPendingMessageEntity notificationPendingMessageEntity) {
// Not important
}
public void reportMailFailure(NotificationMailEntity mailEntity, String failureNotice) {
// Not important
}
}
@无状态
@本地豆
@TransactionAttribute(TransactionAttribute类型.必填)
@服务
公共类通知服务{
私有静态最终记录器Logger=LoggerFactory.getLogger(NotificationService.class);
@PersistenceContext(unitName=“myEntityManager”)
私人实体管理者实体管理者;
@EJB
私有NotificationPendingMessageValidator NotificationPendingMessageValidator;
@EJB
私人通知发现者通知发现者;
@注入
私人申请信息申请信息;
public NotificationPendingMessageEntity saveNotificationMessageForDeferredMail(NotificationPendingMessageEntity NotificationPendingMessageEntity)引发ValidationException{
//不重要
}
公共列表查找NotificationPendingMessageEntities(时隙时隙){
//不重要
}
@TransactionAttribute(TransactionAttributeType.REQUIRES\u NEW)
公共通知MailEntity createNewMailEntity(){
//不重要
}
@TransactionAttribute(TransactionAttributeType.REQUIRES\u NEW)
public void updateEmailEntity(NotificationMailEntity-mailEntity){
//不重要
}
public void createNotificationMessageProcessedEntity(NotificationProcessedMessageEntity NotificationProcessedMessageEntity){
//不重要
}
public void removeNotificationMessagePendingEntity(NotificationPendingMessageEntity NotificationPendingMessageEntity){
//不重要
}
public void reportMailFailure(NotificationMailEntity mailEntity,字符串失败通知){
//不重要
}
}
使用@Inject
注入EJB而不是@EJB
注释可以很好地工作。所以有些Weblogic的补丁应该有问题,因为在另一个Weblogic(同一版本,不同的补丁)中测试它同样有效好问题,我的一位同事也有同样的问题,你知道确切的补丁吗?我们已经得到了12.2.1的确切情况,对不起,不知道。我不负责Weblogic管理方面。不幸的是,Inject在JBoss EAP 7中不能与我的MDB一起工作,我也得到了一个NPE——我读了很多书,每个人基本上都说,在验证调用了@PostConstructs注释的方法之前,不要尝试使用注入的bean——但这对我来说根本不起作用。我知道这个类是在我为构造函数和后构造函数方法(调用了所有东西,但仍然是NPE)放置跟踪输出时构造的。更糟糕的是,我的问题发生在Weblogic上,解决方案就是为了这个目的,我不知道其他应用服务器的情况,但很明显,这是他们如何实现某些规范的问题。我知道我参加聚会迟到了,但我的2美分:还要测试bean上是否没有@Stateless和@TransactionAttribute(TransactionAttributeType.MANDATORY)注释。