javax.naming.NameNotFoundException:MyBean#找不到MyBean
我有一个多模块maven项目,其中包含一个jar模块(模型)、两个EJB模块(存储库、服务)和一个web模块。 可能导致问题的第一件事是,我不知道应该将persistence.xml文件放在哪个EJB模块中 看起来是这样的:javax.naming.NameNotFoundException:MyBean#找不到MyBean,java,maven,jakarta-ee,glassfish,ejb,Java,Maven,Jakarta Ee,Glassfish,Ejb,我有一个多模块maven项目,其中包含一个jar模块(模型)、两个EJB模块(存储库、服务)和一个web模块。 可能导致问题的第一件事是,我不知道应该将persistence.xml文件放在哪个EJB模块中 看起来是这样的: <?xml version="1.0" encoding="UTF-8" ?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.or
<?xml version="1.0" encoding="UTF-8" ?>
<persistence 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" version="1.0">
<persistence-unit name="jthrdb">
<jta-data-source>MySQL</jta-data-source>
</persistence-unit>
</persistence>
有什么建议吗
更新
以下是servlet的一部分:
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
private CandidateBean bean;
/**
* @see HttpServlet#HttpServlet()
*/
public MyServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
Candidate temp = new Candidate();
temp.setFirstName("Pos");
// bean.insert(temp);
out.println("<html>");
out.println("<body>");
out.println("<h1>" + bean.saySomething() + "</h1>");
out.println("</body>");
out.println("</html>");
}
}
@WebServlet(“/MyServlet”)
公共类MyServlet扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
@EJB
私人假丝酵母豆;
/**
*@参见HttpServlet#HttpServlet()
*/
公共MyServlet(){
超级();
//TODO自动生成的构造函数存根
}
/**
*@参见HttpServlet#doGet(HttpServletRequest请求,HttpServletResponse
*(答复)
*/
@凌驾
受保护的无效数据集(HttpServletRequest请求,
HttpServletResponse响应)引发ServletException,IOException{
PrintWriter out=response.getWriter();
候选者临时=新候选者();
临时setFirstName(“Pos”);
//插入(临时);
out.println(“”);
out.println(“”);
out.println(“+bean.saySomething()+”);
out.println(“”);
out.println(“”);
}
}
您不需要persistence.xml中的任何EJB,该文件是JPA配置文件,您可以在其中配置持久层。以下是您应该执行的步骤(我没有深入研究Glassfish配置,因为您必须创建一个名为JDBC/MySQL的MySQL JDBC数据源,并将持久化单元引用到EJB中,为此请参阅Glassfish文档)
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="jthrdb" transaction-type="JTA">
<jta-data-source>jdbc/MySQL</jta-data-source>
<class>com.test.MyJpaEntity</class>
</persistence-unit>
</persistence>
@PersistenceContext(unitName = "jthrdb")
private EntityManager entityManager;
我还发现了另一件事:在persistence.xml中,您正在使用JPA1.0。大多数现代应用服务器和Spring都支持JPA 2.0或event better 2.1的使用,它改进了API,是一个更好的选择(我在这里添加了persistence 2.0配置)。请提供servlet代码和web.xml,您在哪里使用MyBean。我将JPA更改为2.0。这个问题仍然存在。在servlet中,我有一个简单的
entityManager.insert()
方法调用此异常。另一个问题是它不能在mysql模式中自动创建表。我找不到问题。您在这里提到的错误与JPA无关-这里的问题是在JNDI上下文中找不到的EJB MyBean。在servlet中是否有类似@EJB private MyBean的东西;我已经到了JPA可以在数据库中创建实体表的地步。你是对的,这与JPA无关,但那又怎么样?我得到了同样的异常。请在servlet中发布部分代码,您在哪里引用MyBean。另外,请发布定义MyBean的ejb项目的ejb-jar.xml配置文件(仅定义MyBean的部分就足够了)。我发现ejb-jar.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="jthrdb" transaction-type="JTA">
<jta-data-source>jdbc/MySQL</jta-data-source>
<class>com.test.MyJpaEntity</class>
</persistence-unit>
</persistence>
@PersistenceContext(unitName = "jthrdb")
private EntityManager entityManager;
entityManager.persist(myJpaEntity);