我正在部署到Glassfish 3.1.1。JPA/GlassFish 3 - NamingException將EJB注入servlet
我有一個創建jar的JPA項目。它有用@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);
}
}
我已經設置了GlassFish中的JDBC連接池,並能成功地ping數據庫(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>
我到我要注入服務bean的一個servlet:
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");
}
}
當我嘗試部署servlet的戰爭,我在我的籌碼得到了這最後的Caused by
trace:
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]]]
我不知道我在代碼或配置中做了什麼錯誤,導致此問題。任何幫助調試將非常感謝!
是的,這是問題所在。謝謝! – sdoca