我特别是Java和EE的新手。我启动了一个EE项目,它应该提供REST API,它将处理远程Oracle数据库中的2个实体。我正在使用NetBeans,因为它是如何在Enterprise Java中完成任何事情的唯一方法(我现在看到它)。
我做了什么:
<persistence version="2.1" xmlns...>
<persistence-unit name="semestralka-ejbPU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/dbs</jta-data-source>
<class>cz.ctu.bitjv.kopecj24.semestralka.entities.Food</class>
<class>cz.ctu.bitjv.kopecj24.semestralka.entities.User</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="eclipselink.target-database" value="Oracle"/>
</properties>
</persistence-unit>
</persistence>
&#13;
public FoodServiceBean()
{
this.facade = new FoodFacade(Food.class);
this.facade.setEntityManager(Persistence.createEntityManagerFactory("semestralka-ejbPU").createEntityManager());
}
&#13;
然后,有一个REST服务类应该列出数据库中的实体。
@Path(&#34;食品&#34) 公共课FoodResource {
@Context
private UriInfo context;
private FoodServiceInterface service;
/**
* Creates a new instance of FoodResource
*/
public FoodResource() {
try {
InitialContext ic = new InitialContext();
service = (FoodServiceInterface) ic.lookup("java:global/semestralka/semestralka-ejb/FoodServiceBean");
} catch (NamingException ex) {...}
}
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("list")
public String getAll() {
List<Food> foods = service.listAllFood();
...
}
}
不幸的是,一旦我请求getAll操作(访问localhost:8080 / semestralka-war / wr / food / list),我就会遇到这个异常:
Warning: StandardWrapperValve[cz.ctu.bitjv.kopecj24.semestralka.rest.ApplicationConfig]: Servlet.service() for servlet cz.ctu.bitjv.kopecj24.semestralka.rest.ApplicationConfig threw exception
javax.naming.NameNotFoundException: dbs not found
答案 0 :(得分:0)
仔细检查持久性单元和glassfish服务器中的连接池名称。你也可以用实体更新你的问题。
答案 1 :(得分:0)
我可以看到你的休息服务中的ejb呼叫是错误的。您需要使用包路径添加远程接口名称。
假设您的包路径是com.rs.www,那么您的查找字符串应该是以下一个:
service = (FoodServiceInterface) ic.lookup("java:global/semestralka/semestralka-ejb/FoodServiceBean!com.rs.www.FoodServiceInterface");
感谢。
答案 2 :(得分:0)
最后,我找到了一个解决方案。问题发生在我的FoodServiceBean中。我试图在EJB构造函数中实例化Facade,但EntityManager是在构造函数之后注入的。所以这里是Bean的代码,帮助我解决了这个问题。
@Stateless
@EJB(beanInterface=FoodServiceInterface.class, name="FoodServiceBean")
public class FoodServiceBean implements FoodServiceInterface {
@PersistenceContext(unitName="testPU")
private EntityManager em;
private FoodFacade facade;
public FoodServiceBean()
{
}
@PostConstruct
public void init() {
this.facade = new FoodFacade(Food.class);
this.facade.setEntityManager(em);
}
请注意,我更改了持久性单元的名称,以确保没有拼写错误。
感谢您的帮助。