我用一个无状态 Ejb 编写了非常简单的 Web 应用程序,当我实现接口(interface)时有趣的时刻来了——ejb 依赖注入(inject)不起作用:
web.xml
<?xml version="1.0" ?>
<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">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>simpleController</servlet-name>
<servlet-class>com.SimpleController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>simpleController</servlet-name>
<url-pattern>*.job</url-pattern>
</servlet-mapping>
</web-app>
Servlet 类
package com;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SimpleController extends HttpServlet {
@EJB
private SimpleBean bean;
@Override
protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println(bean.getSomeString());
}
@Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
bean
package com;
import javax.ejb.Stateless;
@Stateless
public class SimpleBean /*implements Simple*/ {
public String getSomeString(){
return "axaxaxa!";
}
}
界面
package com;
import javax.ejb.Remote;
//@Local
@Remote
public interface Simple {
String getSomeString();
}
因此,当我取消注释“implements Simple”时,我得到了 NullPointerException(在接口(interface)中带有 @Remote 或 @Local 注释),另一种情况下我得到了“axaxaxa!”。为什么会这样?我读到 Ejb 类必须实现接口(interface)。
我使用 TommEEcas 应用服务器。
最佳答案
问题通过改变 bean 变量类型(到接口(interface)类型而不是类类型)来解决
带有 NullPointerException 的版本
private SimpleBean bean;
工作版本
private Simple bean;
关于java - EJB注入(inject)时出现空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16056881/