NullPointerException 在 Vaadin 7 中调用 EJB
NullPointerException calling EJB in Vaadin 7
我正在使用 Wildfly 8.2、JavaEE 7 和 Vaadin 7。在用户界面层调用无状态 bean findAll() 方法时出现 NullPointerException。你知道为什么吗?下面是我的代码。
@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 {
}
}
你得到 NPE
因为 patientService
是 null
。
问题是 MyUI
class 不是托管 bean,这意味着它不是由 Java EE 容器创建的,这就是 @Inject
注释的原因没有任何效果。
使 MyUI
成为托管 bean 的最简单方法是使用 Vaadin CDI 插件。
我正在使用 Wildfly 8.2、JavaEE 7 和 Vaadin 7。在用户界面层调用无状态 bean findAll() 方法时出现 NullPointerException。你知道为什么吗?下面是我的代码。
@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 {
}
}
你得到 NPE
因为 patientService
是 null
。
问题是 MyUI
class 不是托管 bean,这意味着它不是由 Java EE 容器创建的,这就是 @Inject
注释的原因没有任何效果。
使 MyUI
成为托管 bean 的最简单方法是使用 Vaadin CDI 插件。