2015-04-21 1 views
0

Я использую Wildfly 8.2, JavaEE 7 и Vaadin 7. У меня возникло исключение NullPointerException при вызове метода bean findAll() без состояния бездействия на уровне пользовательского интерфейса. Ты знаешь почему? Ниже мой код.NullPointerException вызывает EJB в Vaadin 7

  @MappedSuperclass 
      public abstract class AbstractEntity implements Serializable { 
       @Id 
       @GeneratedValue(strategy = GenerationType.AUTO) 
       private Long id; 

       //Getters/Setters are here  
      } 

     @Entity 
     public class Patient extends AbstractEntity { 
      String firstName; 
      String lastName; 
      Date DOB; 

      public Patient() {} 
      //Getters/Setters are here 
     } 

    @Stateless 
    public class PatientService { 

     @PersistenceContext(unitName="patient-pu") 
     private EntityManager em; 

     public List<Patient> findAll() { 
      CriteriaQuery<Patient> cq = em.getCriteriaBuilder().createQuery(Patient.class); 
      cq.select(cq.from(Patient.class)); 
      return em.createQuery(cq).getResultList(); 
     } 

    } 

Вот мой persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="patient-pu" transaction-type="JTA"> 
    <jta-data-source>java:jboss/h2</jta-data-source> 
    <class>com.example.samples.backend.data.Patient</class> 
    </persistence-unit> 
</persistence> 

Вот мой Vaadin UI.

@Viewport("user-scalable=no,initial-scale=1.0") 
@Theme("valo") 
@Widgetset("com.example.MyAppWidgetset") 
public class MyUI extends UI { 
    @Inject 
    private PatientService patientService; 

    @Override 
    protected void init(VaadinRequest vaadinRequest) { 
     patientService.findAll(); 
    } 

    @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true) 
    @VaadinServletConfiguration(ui = MyUI.class, productionMode = false) 
    public static class MyUIServlet extends VaadinServlet { 
    } 
} 

ответ

0

Вы получаете NPE потому что patientService является null.

Проблема заключается в том, что класс MyUI не является управляемым компонентом, что означает, что он не создан контейнером Java EE, и поэтому аннотация @Inject не имеет никакого эффекта.

Самый простой способ сделать MyUI в качестве управляемого компонента - использовать аддон Vaadin CDI.

+0

Спасибо. Я изменил использование Vaadin CDI, и теперь я могу выполнить вызов EJB. Но теперь он сказал, что таблица «ПАЦИЕНТ» не найдена. Я использую базу данных H2, поставляемую с Wildfly 8.2. Я создал источник данных и успешно подключился. Я создал таблицу «ПАЦИЕНТ», и у нее есть все поля, как в моем сущности. Вы знаете, почему он не может его найти? – Andy

+0

@Andy может быть, вы могли бы определить, что спящий режим создает таблицу для вас, так что-то вроде: <имя = «hibernate.dialect» значения свойства = «org.hibernate.dialect.H2Dialect» /> <имя свойства = "hibernate.hbm2ddl.auto" value = "create-drop" /> in persistence.xml. –

+0

Теперь он работает. Спасибо Анри. – Andy