Ошибка внедрения зависимостей EJB 3.1


Я создал бин сеанса без состояния, как это:

@WebServlet(name = "ProductController", urlPatterns = {"/ProductController"})
public class ProductController extends HttpServlet {

  @EJB
  private ProductFacadeBean productBean;
}

@Stateless
public class ProductFacadeBean extends AbstractFacade<Product> implements ProductFacadeLocalInterface {
  @PersistenceContext(unitName = "OnlineStorePU")
  private EntityManager em;

  protected EntityManager getEntityManager() {
    return em;
  }

  public ProductFacadeBean() {
    super(Product.class);
  }

}

@Local
public interface ProductFacadeLocalInterface {

  void create(Product product);

  void edit(Product product);

  void remove(Product product);

  Product find(Object id);

  List<Product> findAll();

  List<Product> findRange(int[] range);

  int count();

}


public abstract class AbstractFacade<T> {
  private Class<T> entityClass;

  public AbstractFacade(Class<T> entityClass) {
    this.entityClass = entityClass;
  }

  protected abstract EntityManager getEntityManager();

  public void create(T entity) {
    getEntityManager().persist(entity);
  }

  public void edit(T entity) {
    getEntityManager().merge(entity);
  }

  public void remove(T entity) {
    getEntityManager().remove(getEntityManager().merge(entity));
  }

  public T find(Object id) {
    return getEntityManager().find(entityClass, id);
  }

  public List<T> findAll() {
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
    cq.select(cq.from(entityClass));
    return getEntityManager().createQuery(cq).getResultList();
  }

  public List<T> findRange(int[] range) {
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
    cq.select(cq.from(entityClass));
    javax.persistence.Query q = getEntityManager().createQuery(cq);
    q.setMaxResults(range[1] - range[0]);
    q.setFirstResult(range[0]);
    return q.getResultList();
  }

  public int count() {
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
    javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
    cq.select(getEntityManager().getCriteriaBuilder().count(rt));
    javax.persistence.Query q = getEntityManager().createQuery(cq);
    return ((Long) q.getSingleResult()).intValue();
  }

}

Вопрос:

  1. В чем заключается ошибка ? Как решить ее ?

    Явакс.называющий.NamingException: Поиск не удалось для - java: comp / env / Controller.Productcontroller в/productBean' в SerialContext[myEnv={java.называющий.завод.initial=com.солнце.предприятие.называющий.осущ.SerialInitContextFactory, Ява.именования.фабрика.состояние=ком.солнце.в CORBA.ээ.осущ.презентация.РМИ.JNDIStateFactoryImpl, Ява.называющий.завод.url-адрес.pkgs=com.солнце.предприятие.называющий} [Корневым исключением является класса javax.называющий.NamingException: Исключение разрешения Ejb для ' Remote ejb-ref имя = контроллер.ProductController / productBean,удаленный 3.X интерфейс =EJB.ProductFacadeBean,и EJB-ссылка=null,то подстановки=,собственное=,как JNDI-имя=объект EJB.ProductFacadeBean, refType=сессия' . Фактический (возможно внутренний) пульт дистанционного управления Имя JNDI, используемое для поиска, является 'Объект EJB.ProductFacadeBean#EJB.ProductFacadeBean' [Корневым исключением является класса javax.называющий.NamingException: Поиск не удалось для 'Объект EJB.ProductFacadeBean#EJB.ProductFacadeBean' в SerialContext[myEnv={java.называющий.завод.initial=com.солнце.предприятие.называющий.осущ.SerialInitContextFactory, Ява.именования.фабрика.состояние=ком.солнце.в CORBA.ээ.осущ.презентация.РМИ.JNDIStateFactoryImpl, Ява.называющий.завод.url-адрес.pkgs=com.солнце.предприятие.называющий} [Корневым исключением является класса javax.называющий.NameNotFoundException: EJB-компонента.ProductFacadeBean#EJB.ProductFacadeBean нет найдено]]]

Полное исключение прилагается здесь:

HTTP Status 500 -

type Exception report

message

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: PWC1392: Error instantiating servlet class Controller.ProductController

root cause

com.sun.enterprise.container.common.spi.util.InjectionException: Error creating managed object for class Controller.ProductController

root cause

com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=Controller.ProductController/productBean,Remote
3.x interface =EJB.ProductFacadeBean,ejb-link=null,lookup=,mappedName=,jndi-name=EJB.ProductFacadeBean,refType=Session into class Controller.ProductController

root cause

javax.naming.NamingException: Lookup failed for 'java:comp/env/Controller.ProductController/productBean' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=Controller.ProductController/productBean,Remote
3.x interface =EJB.ProductFacadeBean,ejb-link=null,lookup=,mappedName=,jndi-name=EJB.ProductFacadeBean,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' [Root exception is javax.naming.NamingException: Lookup failed for 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: EJB.ProductFacadeBean#EJB.ProductFacadeBean not found]]]

root cause

javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=Controller.ProductController/productBean,Remote
3.x interface =EJB.ProductFacadeBean,ejb-link=null,lookup=,mappedName=,jndi-name=EJB.ProductFacadeBean,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' [Root exception is javax.naming.NamingException: Lookup failed for 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: EJB.ProductFacadeBean#EJB.ProductFacadeBean not found]]

root cause

javax.naming.NamingException: Lookup failed for 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: EJB.ProductFacadeBean#EJB.ProductFacadeBean not found]

root cause

javax.naming.NameNotFoundException: EJB.ProductFacadeBean#EJB.ProductFacadeBean not found

note The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition 3.1 logs. GlassFish Server Open Source Edition 3.1
  1. Когда я создавал сеанс для сущность bean с помощью netbeans it создал абстрактный фасад для нас ? Какова его цель ? Я знаю фасад шаблон должен служить интерфейсом к направить запрос ?
  2. в чем польза ejb-jar.в XML ?

Все настройки по умолчанию. Боб ejb создается внутри веб-приложения java ee 6, а не в другом war или jar. Сервер Glassfish 3.1.

Пожалуйста, помогите.

Спасибо.

2 3

2 ответа:

Вы должны использовать интерфейс. Если вы используете Seam Solder и CDI, Вы можете указать точную реализацию с помощью

@Inject
@Exact(ProductFacadeBean.class)

Вам нужно ввести Боб, ссылаясь на его интерфейс, а не на его реализацию напрямую. Что-то вроде этого ..

@EJB
private ProductFacadeLocalInterface productBean;

Затем вы можете получить доступ к Бобу, используя методы интерфейса, представленные в ProductFacadeLocalInterface.