我有一个Java EE 6 War项目,其中包含以下内容:
如此声明的EJB(它也是JAX-RS服务):
@Path("/booksList")
@Produces("application/json")
@Stateless
@LocalBean
@Local(BooksListEJB.class)
public class BooksListEJBImpl implements BooksListEJB
声明为的WebComponent:
@WebServlet(urlPatterns="/initDbData")
public class DataInitListener extends HttpServlet {
@EJB
private BooksListEJB booksListEJB;
WEB-INF文件夹中的空beans.xml文件
当我在WebLogic 12c中部署它时,出现以下错误:
<Warning> <weblogic.jaxrs.onwls.deploy.ejb.provider.EJBComponentProviderFactory> <BEA-000000> <An instance of EJB class com.shivandragon.jee6TestService.ejb.impl.BooksListEJBImpl could not be looked up using simple form name. Attempting to look up using the fully-qualified form name.
javax.naming.NameNotFoundException: While trying to look up comp/env/BooksListEJBImpl in /app/webapp/jee6Test-service-0.1-SNAPSHOT.war/2039754748.; remaining na
me 'comp/env/BooksListEJBImpl'
at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1180)
at weblogic.jndi.internal.ApplicationNamingNode.lookup(ApplicationNamingNode.java:146)
at weblogic.jndi.internal.WLEventContextImpl.lookup(WLEventContextImpl.java:253)
at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:426)
at weblogic.jndi.factories.java.ReadOnlyContextWrapper.lookup(ReadOnlyContextWrapper.java:45)
Truncated. see log file for complete stacktrace
我看了类似的问题,并找到了将@ManagedBean添加到servlet的建议。试过但却有同样的错误。
我的问题是:
不应该这样做,我是否滥用了一些Java EE 6指令/标准?
答案 0 :(得分:1)
在EJB 3.1中添加了新的Bean视图 - LocaBean。你可以开发一个bean,而不需要实现任何工作。该bean视图是“无接口视图”,使用@LocalBean注释并通过classname注入。有些bean实现了一些本地接口并具有“本地视图”,应该通过本地接口注入。在您的代码中,您混合了无接口视图bean和本地视图bean。您应该删除@SocalBean注释@Sam应答。
<强>更新强>
我在 WebLogic Server 12.1.1.0 上测试它。
使用一种方法创建一个简单的界面:
package ejbrest;
public interface SessionEJBLocal {
public String hello();
}
然后使用RESTful注释创建EJB:
package ejbrest;
// ... imports
@Path("/booksList")
@Produces("application/json")
@Stateless
@Local(SessionEJBLocal.class)
public class SessionEJBBean implements SessionEJBLocal {
public SessionEJBBean() {
}
@Override
@GET
public String hello() {
return "Hello, world";
}
}
部署描述符,web.xml(您可以看到它没有任何servlet定义):
<?xml version = '1.0' encoding = 'UTF-8'?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>
您可以为本地bean注入演示创建一个servlet:
package ejbrest;
// ... imports
@WebServlet(name = "DemoServlet", urlPatterns = { "/demoservlet" })
public class DemoServlet extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=UTF-8";
@EJB
private SessionEJBLocal ejb;
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>DemoServlet</title></head>");
out.println("<body>");
out.println("<p>The servlet has received a GET. This is the reply: " +
ejb.hello() + "</p>");
out.println("</body></html>");
out.close();
}
}
部署后,您可以尝试通过url调用RESTful服务:
http://[host]:[port]/[appcontext]/resources/booksList
响应:
Hello, world
此外,你的演示servlet可以通过url访问:
http://[host]:[port]/[appcontext]/demoservlet
响应:
The servlet has received a GET. This is the reply:Hello, world
默认情况下,Oracle WebLogic Server使用resources
作为Jersey servlet上的链接。请阅读the official documentation以获取有关所有支持的部署变体的信息。