это мой первый пост, поэтому, если он не понятен, пожалуйста, не стесняйтесь спрашивать.
Я пытаюсь разработать gwt-приложение, которое использует мои собственные ejb-классы из внешнего магазина-проекта.
Мой ServiceImpl достигает ejb, как требуется, однако я не могу использовать Injection, как мне кажется. В моем ejb-классе я вызываю функцию для создания моей тестовой базы данных с фиктивными данными. Для этого (и позже для любых запросов конечно) я хотел ввести EntityManager. Это сделано в моей базе базового класса.
проблема: EntityManager не может быть инициализирован. Я попробовал обе аннотации:
@PersistenceUnit(unitName = "sung.app.kylintv.ejb")
protected EntityManagerFactory entityManagerFactory;
protected EntityManager entityManager = entityManagerFactory.createEntityManager();
, а также:
@PersistenceContext(unitName="sung.app.kylintv.ejb")
protected EntityManager entityManager;
Я использую jBoss 6.1.0. Наконец, сервер GWT 2.4 вызывает мою ejb-функцию.
JBoss запускается правильно, без ошибок. Однако при вызове функции я получаю это сообщение об ошибке:
Caused by: javax.ejb.EJBException: java.lang.NullPointerException
...
Caused by: java.lang.NullPointerException
at sung.app.kylintv.HomeBase.<init>(HomeBase.java:28) [:]
at sung.app.kylintv.product.ProductHome.<init>(ProductHome.java:35) [:]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [:1.6.0_25]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) [:1.6.0_25]
at
Отладив функцию, я обнаружил, что entityManager равен NULL.
Как я могу заставить инъекцию работать? Или я совершенно неверно к этому отношусь?
Для получения дополнительной информации, если требуется:
Код:
package sung.app.kylintv.gwt.server;
import javax.ejb.EJB;
import sung.app.kylintv.gwt.client.DatabaseBuilderService;
import sung.app.kylintv.product.Product;
import sung.app.kylintv.product.ProductHome;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
public class DatabaseBuilderServiceImpl extends RemoteServiceServlet implements DatabaseBuilderService
{
@EJB(mappedName = "sung/app/kylintv/product" )
private transient Product product;
@Override
public boolean createDefaultDatabaseEntries()
{
return product.createTestEntry();
}
}
Инициированный класс (через интерфейс продукта) ProductHome:
@Stateless(name="Product")
@Local(Product.class)
public class ProductHome extends HomeBase<ProductEntity> implements Serializable, Product
{
@EJB
protected Option sessionOption;
@TransactionAttribute(REQUIRED)
public boolean createTestEntry()
{
try
{
System.out.println("TEST creating Data BEGIN");
ProductEntity currentProduct = new ProductEntity();
// ++++ fill FIRST product ++++
currentProduct.setName("bo_product_europe_basic_name");
currentProduct.setDescription("bo_product_europe_basic_description");
getEntityManager().persist(currentProduct); **<- HERE THE ERROR OCCURS**
... **For better overview I removed the further object-creation**
}
catch(Exception e)
{
//print out an error message and return false
System.out.println( e.getCause().getMessage() );
return false;
}
return true;
}
}
Расширенная база базы:
public abstract class HomeBase<T>
{
@PersistenceUnit(unitName = "sung.app.kylintv.ejb")
protected EntityManagerFactory entityManagerFactory;
private EntityManager entityManager = entityManagerFactory.createEntityManager();
// @PersistenceContext(unitName = "sung_app_kylintv")
// protected EntityManager entityManager;
//
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public EntityManager getEntityManager() {
return entityManager;
}
}