2016-04-27 155 views
0

在企业应用程序中,我试图使用netBeans 8.1将MessageDriven bean注入到Web应用程序(到REST服务)。我不明白IDE中的任何警告,但是,在部署时,我收到以下错误:注入消息驱动bean

严重:异常而加载的应用程序:CDI部署失败:WELD-001408:类型StatisticsBean不满意的依赖与预选赛@default 于注射点[BackedAnnotatedField] @注入私人sv.mycompany.rest.RestService.statisticsBean

这里是豆类我试图注入之一:

@MessageDriven(mappedName = "dzsobTopik") 
public class StatisticsBean implements MessageListener{ 

private Logger LOGGER = Logger.getLogger(StatisticsBean.class.getSimpleName()); 
private int scheduledJobs = 0; 

@Inject 
private JMSContext jmsContext; 

private static Map<Integer, Boolean> results = new HashMap<>(); 

public StatisticsBean() { 
} 



public static Map<Integer, Boolean> getResults() { 
    return results; 
} 

public void setResults(Map<Integer, Boolean> results) { 
    StatisticsBean.results = results; 
} 



@Override 
public void onMessage(Message message) { 
    if(message instanceof JobScheduledMessage){ 
     scheduledJobs++; 
    } 
    else if(message instanceof JobCompletedMessage && scheduledJobs>0) { 
     if(((JobCompletedMessage) message).getTimestamp()<5){ 
      LOGGER.log(Level.INFO, "Job successful!"); 
       results.put(((JobCompletedMessage) message).getJobnumber(), Boolean.TRUE); 
       scheduledJobs--; 
     } 
     else { 
       LOGGER.log(Level.INFO, "Job unsuccessful!"); 
       results.put(((JobCompletedMessage) message).getJobnumber(), Boolean.FALSE); 
       scheduledJobs--; 
      } 
    } 
} 
} 

这里是我的restService类:

@Path("/start") 
@Produces(MediaType.APPLICATION_JSON) 
public class RestService { 

@Inject 
private JobScheduler jobScheduler; 

@Inject 
private StatisticsBean statisticsBean; 

@Inject 
private FastWorker fastWorker; 

@Inject 
private SlowWorker slowWorker; 

@Inject 
private NormalWorker normalWorker; 

@GET 
@Produces(MediaType.TEXT_PLAIN) 
public String startSimulation() throws InterruptedException{ 
    jobScheduler.queueNewJobs(); 
    return "Started simulation"; 
} 

@GET 
@Path("/jobresult") 
public Map<Integer,Boolean> getJobResults(){ 
    return StatisticsBean.getResults(); 
} 

} 

我在ejb和web模块中都有beans.xml,在这两种情况下发现模式都设置为“all”。可能是什么问题呢?

+0

可能重复的[EJB3 - 注入MDB到另一个MDB?](http://stackoverflow.com/questions/8246963/ejb3-inject-a-mdb-into-another-mdb) –

回答

3

为什么要在第一个位置注入它?这些不是会话bean,不打算用于注入。消息驱动的bean通过特殊的消息传递接口由JCA资源适配器(如JMS实现)访问。 MDB可能会合并,因此保持其中的任何状态都没有意义。在Java EE中,使用没有事先理解的技术总是会导致痛苦,因此,考虑检查关于这些bean的EJB documentation

在你的特定情况下,如果你真的需要存储一些东西进行进一步处理,你应该考虑使用singleton会话bean或应用程序范围的CDI bean来代替。那些能够保持有意义的状态,并且可以注入任何托管bean,包括MDB。

+0

谢谢,它转身我真的不需要注入它们。我是Java EE课程的初学者,这是我们的作业之一。但现在我明白了,谢谢你的回答! –