Я пишу свое первое приложение Java EE (EJB + Servlets и т. Д.) (Обратите внимание: я использую Eclipse).
У меня возникла проблема с неработающим внедрением EntityManager, и у меня возникли некоторые трудности с поиском причин из-за моего неловкости в Java EE (и в целом в Java).
Вот мой persistence.xml
файл - я думаю, что это в основном правильно, так как я могу запустить менеджер баз данных HSQL из консоли JMX, и моя таблица PUBLIC.USER отображается правильно.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
<persistence-unit name="MyPu">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/DefaultDS</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
</properties>
</persistence-unit>
</persistence>
Вот мой код сервлета:
[...]
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
String id = request.getParameter("username");
String password = request.getParameter("password");
UserManagerBean um = new UserManagerBean();
um.register(username, password);
RequestDispatcher dispatcher=getServletContext().getRequestDispatcher("/index.jsp");
dispatcher.forward(request, response);
}
А вот и мой класс UserManagerBean:
//bunch of imports
import myPackage.UserManager;
public @Stateful class UserManagerBean implements UserManager {
@PersistenceContext(unitName="MyPu")
private EntityManager persistManager;
public void register(String username, String password) {
User user = new User(userame, password);
persistManager.persist(user);
persistManager.flush();
}
}
Строка persistManager.persist(user)
создает исключение NullPointerException.
Из моего собственного поиска я понял, что это происходит потому, что, поскольку я вызываю new () в UserManagerBean, инъекция из аннотации @PersistenceContext
никогда не происходит, и persistManager никогда не связывается.
Если так, то очевидно, что я что-то упускаю из-за правильного использования EJB.
Как правильно создать экземпляр моего бина? Что с интерфейсами? Я не совсем уверен, должен ли мой бин быть с состоянием или без состояния: \
Дополнительная информация:
Я изменил код в своем сервлете, с
UserManagerBean um = new UserManagerBean();
до
@EJB
private UserManagerBean um;
в соответствующем месте. Теперь um
является нулевым указателем.