Jakarta ee 注入消息驱动bean

Jakarta ee 注入消息驱动bean,jakarta-ee,cdi,message-driven-bean,Jakarta Ee,Cdi,Message Driven Bean,在企业应用程序中,我尝试使用netBeans 8.1将消息驱动bean注入web应用程序(到REST服务)。我在IDE中没有收到任何警告,但是,在部署时,我收到以下错误: 严重:加载应用程序时出现异常:CDI部署失败:WELD-001408:类型StatisticsBean与限定符@Default的依赖关系不满意 在注入点[BackedAnnotatedField]@InjectPrivate sv.mycompany.rest.RestService.statisticsBean 下面是我尝试

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

严重:加载应用程序时出现异常:CDI部署失败:WELD-001408:类型StatisticsBean与限定符@Default的依赖关系不满意 在注入点[BackedAnnotatedField]@InjectPrivate sv.mycompany.rest.RestService.statisticsBean

下面是我尝试注入的一个bean:

@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--;
            }
    }
}
}
@MessageDriven(mappedName=“dzsobTopik”)
公共类StatisticsBean实现MessageListener{
私有Logger=Logger.getLogger(StatisticsBean.class.getSimpleName());
private int scheduledJobs=0;
@注入
私有JMSContext JMSContext;
私有静态映射结果=new HashMap();
公共统计{
}
公共静态映射getResults(){
返回结果;
}
公共void setResults(映射结果){
统计结果=结果;
}
@凌驾
消息(消息消息)上的公共无效{
if(JobScheduledMessage的消息实例){
scheduledJobs++;
}
else if(JobCompletedMessage和scheduledJobs的消息实例>0){

if(((JobCompletedMessage)message).getTimestamp()为什么要首先注入它?这些不是会话bean,也不是用于注入的。消息驱动bean由JCA资源适配器访问(如JMS实现)通过特殊的消息接口,MDBS可以被合并,所以保持它们内部的任何状态是没有意义的。在java EE中,使用没有事先理解的技术总是会导致痛苦,所以,考虑检查那些bean。

在您的特定情况下,如果您确实需要存储一些东西以进行进一步的处理,那么您应该考虑使用SuntLon会话bean或应用程序范围的CDI bean。这些都能够保持有意义的状态,并且可以注入到任何托管bean中,包括MDBs。

为什么要首先将其注入?THOS。e不是会话bean,也不用于注入。消息驱动bean由JCA资源适配器访问(如JMS实现)通过特殊的消息接口,MDBS可以被合并,所以保持它们内部的任何状态是没有意义的。在java EE中,使用没有事先理解的技术总是会导致痛苦,所以,考虑检查那些bean。


在您的特定情况下,如果您确实需要存储一些东西以进行进一步的处理,那么您应该考虑使用SuntLon会话bean或应用程序范围的CDI bean。这些都能够保持有意义的状态,并且可以注入到任何托管bean中,包括MDBs。欧,原来我真的不需要注射它们。我是Java EE课程的初学者,这是我们的家庭作业之一。但现在我明白了,谢谢你的回答!谢谢,原来我真的不需要注射它们。我是Java EE课程的初学者,这是我们的家庭作业之一。但现在我明白了,谢谢你的回答!

@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();
}

}