在企业应用程序中,我正在尝试使用netBeans 8.1将MessageDriven bean注入Web应用程序(到REST服务)。我在IDE中没有收到任何警告,但是,在部署时我收到以下错误:
严重:加载应用程序时出现异常:CDI部署失败:WELD-001408:类型为StatisticsBean且带有限定符@Default的依赖项不满意 在注入点[BackedAnnotatedField] @Inject private 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 :(得分:3)
为什么你会在第一时间注射它?这些不是会话bean,不适合注射。消息驱动的bean由JCA资源适配器(如JMS实现)通过特殊消息传递接口访问。 MDB可以合并,因此保持其中的任何状态都是毫无意义的。在Java EE中,在没有事先理解的情况下使用技术总会导致痛苦,因此,请考虑检查EJB documentation关于这些bean的内容。
在您的特定情况下,如果您确实需要存储某些内容以进行进一步处理,则可以考虑使用单例会话bean或应用程序范围的CDI bean。它们能够维护有意义的状态,并且可以注入任何托管bean,包括MDB。