2013-03-24 42 views
0

我有一个ManagedBean gett无状态bean注入,但它总是给我一个注入空指针。我在这里做错了什么? (I'm学习JSF和它只是一个例子,所以请忽略类等的命名)注入到托管bean的statless bean给出空指针

有两个不同的罐子(web.jar和services.jar)

托管bean

@ManagedBean 
@RequestScoped 
public class HelloPB 
{ 
    @Inject 
    private ExamServiceBase examService; 

    private String name = ""; 

    public String getName() 
    { 
     Exam exam = examService.getSingleExam(); 
     return exam.getName(); 
    } 

    public void setName(final String name) 
    { 
     //this.name = name; 
    } 

    public String getHello() 
    { 
     if (name == null || name.length() < 1) 
     { 
      return null; 
     } 
     return "Hello " + name; 
    } 
} 

无国籍豆

@Stateless 
public class ExamServiceBase implements ExamService{ 

    @PersistenceContext(name="QuestifyPersistUnit") 
    private EntityManager em; 

    public Exam getExam(String id){ 
     return em.find(Exam.class, id); 
    } 

    public Exam getSingleExam(){ 
     return em.find(Exam.class, "9E69F3EE-AE9E-4D53-B531-35504EDA450F"); 
    } 
} 

的index.xhtml

<h:body> 
    <h:outputScript name="jsf.js" library="javax.faces" target="body"> 
    </h:outputScript> 
    <h1>JSF 2 Demo</h1> 
    <h:form> 

     <h:inputText id="name" value="#{helloPB.name}"> 
      <f:ajax render="helloTextOutput" /> 
     </h:inputText> 

     <h:commandButton value="Say Hi via Ajax"> 
      <f:ajax execute="name" render="helloTextOutput" /> 
     </h:commandButton> 
     <h:outputText id="helloTextOutput" value="#{helloPB.hello}" /> 
    </h:form> 

</h:body> 
+0

ExamServiceBase是一个EJB,所以你试图通过EJB注释注入它吗?我不确定它是否适用于Inject ... – perissf 2013-03-24 18:11:19

+0

@perissf,它的工作原理和它是完全合法的。 @Martin,是'ExamService'和'@ Local'接口?你应该尝试注入,如果它是 – kolossus 2013-03-24 18:48:52

+0

@kolossus我确实有一个本地接口,这就是我原来使用的,但既没有,也没有我的实际实现。两者都给出空指针例外 – Marthin 2013-03-25 08:38:41

回答

0

我有类似的问题。确保最初在应用程序中有一个文件WEB-INF/beans.xml。它可以是一个空文件,以及:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org /2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 

然后尝试从postcostruct方法使用注入的Bean。在我的情况下,它以这种方式工作。

@PostConstruct 
void init() { 
Exam exam = examService.getSingleExam(); 
} 
+0

今天晚些时候我会试试这个,但是,这个真的看起来像是一个黑客而不是一个可靠的解决方案。 = – Marthin 2013-03-25 08:42:57

+0

今天晚些时候我会试试,但是,它看起来像一个黑客攻击。任何理由为什么这会工作?感谢您的帮助! – Marthin 2013-03-25 08:43:55

+0

@Marthin,这不是黑客,但实际上是CDI的工作要求。您必须在Web-app的WEB-INF中具有beans.xml文件(如果适用)以使注入工作 – kolossus 2013-03-25 10:34:36