【发布时间】:2014-02-22 07:37:55
【问题描述】:
我正在尝试学习如何分离 Java EE 组件。
我想将我的 jpa 实体、ejb 和 Web 客户端分离到不同的项目中
所以我开发了四个不同的项目并将它们编译到自己的 jars/wars 中
- DomainEntities - 包含我的 JPA 实体
- RemoteInterface - 包含远程接口(我正在尝试分离实现)
- RemoteEJB - 从 RemoteInterface 实现接口(项目 2)
- WebApp 客户端(我有一个调用 RemoteInterface 来测试 ejb 是否工作的 servlet)
DomainEntities 的 jar 结构是
DomainEntities
-META-INF
-MANIFEST.MF
-entities
-Student.class
RemoteEJB的jar结构是
RemoteEJB
-META-INF
-MANIFEST.MF
-persistence.xml
-sample
MyStatelessBean.class
RemoteEJB中的persistence.xml是(根据网上搜索):
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.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_2_0.xsd">
<persistence-unit name="RemoteEJBPU" transaction-type="JTA"><provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/pwucdb</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<!--<jar-file>DomainEntities.jar</jar-file>-->
</persistence-unit>
</persistence>
jta 数据源在我的 glassfish 服务器中定义。 exclude-unlisted-classes 和 jar-file 标签基于我对在不同 jar 上分离 jpa 实体的研究。当我取消注释jar-file标签时,ejb无法部署到服务器,所以我注释它。
调用使用ejb的servlet是:
@WebServlet(name = "NewServlet", urlPatterns = {"/NewServlet"})
public class NewServlet extends HttpServlet {
@EJB
private MyRemoteInterface myRemoteInterface;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
out.println(myRemoteInterface.getMessage());
out.println("Num of records retrived: " + myRemoteInterface.getStudents().size());
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
当我尝试访问 servlet 时出现此警告/错误
WARNING: The collection of metamodel types is empty. Model classes may not have been found during entity search for Java SE and some Java EE container managed persistence units. Please verify that your entity classes are referenced in persistence.xml using either <class> elements or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element
WARNING: A system exception occurred during an invocation on EJB MyStatelessBean method public java.util.List sample.MyStatelessBean.getStudents()
javax.ejb.EJBException
.....
Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager:
Exception Description: Error compiling the query [SELECT s FROM Student s]. Unknown entity type [Student].
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1477)
如果我注释掉 exclude-unlisted-classes 标记,取消注释 jar-file 标记并部署。我收到此服务器警告:
a jar-file [DomainEntities.jar] specified in persistence.xml is not found
The server also looked for a file called [...\build\DomainEntities_jar].
【问题讨论】: