jsf托管bean中的EJB注入错误

jsf托管bean中的EJB注入错误,jsf,ejb,glassfish-3,managed-bean,Jsf,Ejb,Glassfish 3,Managed Bean,我正在尝试制作一个示例应用程序,它根据用户在表单中输入的子字符串显示一个学生表。我正在使用jsf、ejb和jsf managebean。我正在将ejb注入托管bean,但似乎ejb没有被注入。这是我的密码: jsf托管bean: @ManagedBean @RequestScoped public class InputBean { @EJB(beanName = "sbean") private StudentBean studentBean; private String myValue

我正在尝试制作一个示例应用程序,它根据用户在表单中输入的子字符串显示一个学生表。我正在使用jsf、ejb和jsf managebean。我正在将ejb注入托管bean,但似乎ejb没有被注入。这是我的密码:

jsf托管bean:

@ManagedBean
@RequestScoped
public class InputBean {

@EJB(beanName = "sbean")
private StudentBean studentBean;

private String myValue;
private List<Student> studentList;


public String getList(){
    System.out.println(this.myValue);

    if(studentBean != null){
        System.out.println("Student Bean NOT null");
        this.studentList = studentBean.findByLastname(this.myValue);
    }
    else{
        System.out.println("Student Bean IS null");
    }
    return "dataTable";
} 
//setters and getters here
}
@Stateless(name = "sbean")
@LocalBean
public class StudentBean {

@PersistenceContext
private EntityManager em;

public List<Student> findByLastname(String lastname){
    List<Student> students = em.createQuery("select s from Student s where s.lastname LIKE :keyword").setParameter("keyword", lastname +"%").getResultList();
    return students;
} 
}
@ManagedBean
@请求范围
公共类InputBean{
@EJB(beanName=“sbean”)
私人学生豆;
私有字符串myValue;
私人名单学生名单;
公共字符串getList(){
System.out.println(this.myValue);
if(studentBean!=null){
System.out.println(“学生Bean非空”);
this.studentList=studentBean.findByLastname(this.myValue);
}
否则{
System.out.println(“学生Bean为空”);
}
返回“数据表”;
} 
//这里有二传手和接球手
}
ejb:

@ManagedBean
@RequestScoped
public class InputBean {

@EJB(beanName = "sbean")
private StudentBean studentBean;

private String myValue;
private List<Student> studentList;


public String getList(){
    System.out.println(this.myValue);

    if(studentBean != null){
        System.out.println("Student Bean NOT null");
        this.studentList = studentBean.findByLastname(this.myValue);
    }
    else{
        System.out.println("Student Bean IS null");
    }
    return "dataTable";
} 
//setters and getters here
}
@Stateless(name = "sbean")
@LocalBean
public class StudentBean {

@PersistenceContext
private EntityManager em;

public List<Student> findByLastname(String lastname){
    List<Student> students = em.createQuery("select s from Student s where s.lastname LIKE :keyword").setParameter("keyword", lastname +"%").getResultList();
    return students;
} 
}
无状态(name=“sbean”) @本地豆 公共类学生bean{ @持久上下文 私人实体管理者; 公共列表findByLastname(字符串lastname){ List students=em.createQuery(“从Student s中选择s,其中s.lastname LIKE:keyword”).setParameter(“关键字”,lastname+“%”)。getResultList(); 留学生; } } jsf表单:

<h:form>
  <h:inputText value="#{inputBean.myValue}"></h:inputText>
  <h:commandButton value="Submit"
                             action="#{inputBean.getList}"/>
</h:form>

jsf数据表页面:

<h:dataTable value="#{inputBean.studentList}" var="student">
    <h:column>
       <h:outputText value="#{student.studentId}"></h:outputText>
    </h:column>
    <h:column>
       <h:outputText value="#{student.firstname}"></h:outputText>
    </h:column>
    <h:column>
       <h:outputText value="#{student.middlename}"></h:outputText>
    </h:column>
    <h:column>
       <h:outputText value="#{student.lastname}"></h:outputText>
    </h:column>
 </h:dataTable>

在上面的代码中,始终调用getList方法的else条件,这意味着EJB没有正确注入

其他可能有帮助的信息:

  • 我将GlassFish3.1.1与JSF2.2一起使用
  • 我试过使用@Named 注释而不是@ManagedBean注释,但我得到了一个 目标不可到达异常
  • 我已经尝试过将EJB注入 一个servlet,它运行良好

我还没有足够的代表来添加评论和问你一些问题,所以我将发布我的评论作为答案。
您说过您正在使用glassfish3和jsf2.2。Glassfish3在javaee6上运行,jsf2.2特定于javaee7。我建议转到glassfish4和javaee7,或者如果您依赖GlassFish3,请降级到jsf2.0和javaee6。

什么时候执行getList()?有没有可能在注射前调用它?您可以创建测试函数void init(),用@PostConstruct对其进行注释,并检查其中studentBean的值以查看注入是否正常工作。从server.log有什么线索吗?好吧,事实上GF3是JSF2.1自带的!