2014-02-19 2 views
0

Я пытаюсь создать пример приложения, которое отображает таблицу студентов на основе ввода подстроки пользователем в форме. Я использую jsf, ejb и jsf managebean. я вводя ejb в управляемый компонент, но кажется, что ejb не вводится. Heres мой код:EJB injection in jsf managed bean error

Управляемый компонент JSF:

@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 
} 

EJB:

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

JSF форма:

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

JSF dataTablepage:

<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> 

В приведенных выше кодах всегда выполняется условие else метода getList, что означает, что EJB неправильно вводится.

дополнительная информация, которая может помочь:

  • Я использую GlassFish 3.1.1 с JSF 2.2.
  • Я попытался использовать аннотацию @Named вместо аннотации @ManagedBean, но я получаю исключающее недопустимое исключение .
  • Я попытался инъекции EJB в сервлет, и она отлично работает
+0

Когда выполняется ваш getList()? Возможно ли, что это называется до инъекции? Вы можете создать тестовую функцию void init(), аннотировать ее с помощью @PostConstruct и проверить значение studentBean внутри нее, чтобы увидеть, правильно ли работает инъекция. –

+0

Я добавил функцию init, как вы сказали, и studentBean имеет значение – user3308224

+0

Это странно. Любые подсказки от server.log? –

ответ

1

У меня нет достаточного количества респ чтобы добавить комментарий и задать вам несколько вопросов, поэтому я выложу свой комментарий как ответ. Вы сказали, что используете Glassfish3 и jsf2.2. Glassfish3 работает на javaee6, а jsf2.2 - javaee7. Я предлагаю перейти к glassfish4 и javaee7, или если вы зависите от стеклянной рыбы 3, перейдите на jsf2.0 и javaee6.

+0

i понижен до 2.0.11, и мой код работает сейчас. – user3308224

+0

ну, Infact GF3 поставляется с JSF 2.1! – Sergio

Смежные вопросы