JPA / Glassfish 3 — Исключение NamingException, вводящее EJB в сервлет

#exception #jakarta-ee #jpa #dependency-injection #glassfish-3

#исключение #джакарта-ee #jpa #внедрение зависимости #glassfish-3

Вопрос:

Я развертываю Glassfish 3.1.1.

У меня есть проект JPA, который создает jar. В нем есть стандартные классы модели данных, аннотированные @Entity , и классы обслуживания, аннотированные @Stateless . Все классы обслуживания наследуются от класса GenericServiceBean:

 @Stateless
public class GenericServiceBean implements GenericService
{
    @PersistenceContext(unitName = "myUnitName")
    EntityManager em;

    public GenericServiceBean()
    {
        // empty
    }

    public <T> T create(T t)
    {
        em.persist(t);   
        return t;
    }

    public <T> T update(T t)
    {
        return em.merge(t);
    }

    public List<?> findWithNamedQuery(String namedQueryName,
            Map<String, Object> parameters)
    {
        return findWithNamedQuery(namedQueryName, parameters, 0);
    }

    public List<?> findWithNamedQuery(String namedQueryName,
            Map<String, Object> parameters, int resultLimit)
    {
        Query query = this.em.createNamedQuery(namedQueryName);

        if (resultLimit > 0)
        {
            query.setMaxResults(resultLimit);
        }

        for (Map.Entry<String, Object> entry : parameters.entrySet())
        {
            query.setParameter(entry.getKey(), entry.getValue());
        }

        return query.getResultList();
    }
}

public class BatchService extends GenericServiceBean
{
    public BatchService()
    {
        super();
    }

    public Batch create(Batch batch)
    {
        return this.create(batch);
    }

    public Batch find(Batch batch)
    {
        return this.update(batch);
    }

    public List<Batch> findByStatus(String status)
    {
        HashMap<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("status", status);

        return (List<Batch>) this.findWithNamedQuery("Batch.findByStatus",
                parameters);
    }
}
  

Я настроил пул соединений JDBC в Glassfish и могу успешно выполнить пинг базы данных (MySQL). Я настроил ресурс JDBC, jdbc/myUnitName связанный с пулом. Поскольку я установил свойства URL, пользователя, пароля и т.д. В пуле, я не добавлял их к ресурсу и не включал их в persitence.xml . которое выглядит следующим образом:

 <?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="myUnitName">
        <jta-data-source>jdbc/myUnitName</jta-data-source>
        <properties>
            <property name="eclipselink.logging.level" value="FINE" />
        </properties>
    </persistence-unit>
</persistence>
  

У меня есть сервлет, в который я хочу внедрить компонент service:

 public class ESwimConnectivityServlet extends HttpServlet
{
    @EJB
    private BatchService batchService; 

    @Override
    protected void service(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, IOException
    {
        log.debug("Enter service()");
        this.processRequest(request, response);
        log.debug("Exit service()");

    String message = ("Connecting to database: ");

    try
    {
        List<Batch> batches = batchService.findByStatus(ProcessingStatusEnum.SUCCESS.toString());
        message  = "SUCESS - batch query returned "   batches.size();
    }
    catch (Throwable t)
    {
        message  = "FAIL - see log for details";
        log.error("Could not query database", t);
    }

    response.getWriter().write(message   "n");

    }
}
  

Когда я пытаюсь развернуть войну сервлетов, я получаю этот финал Caused by в моей трассировке стека:

 Caused by: javax.naming.NamingException: 
Lookup failed for 'java:comp/env/com.mycompany.MyServlet/batchService' 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=com.mycompany.MyServlet/batchService,Remote 3.x interface =com.mycompany.service.BatchService,ejb-link=null,lookup=,mappedName=,jndi-name=com.mycompany.service.BatchService,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'com.mycompany.service.BatchService#com.mycompany.service.BatchService'
[Root exception is javax.naming.NamingException: Lookup failed for 'com.mycompany.service.BatchService#com.mycompany.service.BatchService' 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: com.mycompany.service.BatchService#com.mycompany.service.BatchService not found]]]
  

Я не знаю, что я сделал неправильно в своем коде или конфигурации, чтобы вызвать эту проблему. Любая помощь в отладке была бы высоко оценена!

Ответ №1:

Я думаю, вам нужно снабдить свой BatchService класс @Stateless аннотацией, чтобы сделать его вводимым. Я не уверен, но я думаю, что аннотации не могут быть унаследованы.

Комментарии:

1. Да, это была проблема. Спасибо!

Ответ №2:

Из другого источника:

Сеансовый компонент не может расширить сессионный компонент

спецификация EJB Core 4.6.2

Класс session bean может иметь суперклассы и / или суперинтерфейсы. Класс session bean НЕ ДОЛЖЕН иметь суперкласс, который сам по себе является классом session bean.