会话上下文为空 JBOSS 7.1
Session context is null JBOSS 7.1
更新问题:
我使用了 JBOSS Develper Studio 8,基于 jre 1.7 的 JBOS 服务器 7.1 我有一个包含 ejb 和 web 项目的 J2EE 项目。在 ejb 项目中我有两个相同的 ejb 3.1 在 web 项目中我只有一个 servlet。这个 servlet 在第一个 ejb 中调用简单的测试方法,然后在第二个 ejb 中调用。测试方法中的第一件事是通过此代码
对资源会话上下文进行依赖注入
@Resource
private SessionContext context;
第一个 ejb 工作正常,但第二个(和任何后续的)return 会话上下文为空。这是完整的代码:
FirstServlet.java
@WebServlet("/FirstServlet")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
FirstEJB firstEJB = new FirstEJB();
SecondEJB secondEJB = new SecondEJB();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println(firstEJB.helloFirst());
out.println(secondEJB.helloSecond());
}
}
FirstEJB.java
@Stateless
public class FirstEJB {
@Resource
private SessionContext contextFirst;
public String helloFirst(){
System.err.println(contextFirst.toString());
return "Hello from FirstEJB";
}
}
SecondEJB.java
@Stateless
public class SecondEJB {
@Resource
private SessionContext contextSecond;
public String helloSecond(){
System.err.println(contextSecond.toString());
return "Hello from SecondEJB";
}
}
谁知道问题出在哪里。
使用注入的第一条规则是您的服务器(也称为 "container")创建您注入的对象。
在你的例子中,每个 EJB 实例的生命周期都在容器的完全控制之下。
在您的代码中,您创建的 firstEJB
实例被容器创建的另一个实例替换。 secondEJB
实例仍然是您创建的实例(它缺少 @EJB
注释),因此它没有受到适当的生命周期管理,也没有完全构建它的 @Resource
注入处理.
因此,对您的 servlet 代码进行简单更改:
@WebServlet("/FirstServlet")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
private FirstEJB firstEJB;
@EJB
private SecondEJB secondEJB;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println(firstEJB.helloFirst());
out.println(secondEJB.helloSecond());
}
}
应该会给你想要的结果。
更新问题:
我使用了 JBOSS Develper Studio 8,基于 jre 1.7 的 JBOS 服务器 7.1 我有一个包含 ejb 和 web 项目的 J2EE 项目。在 ejb 项目中我有两个相同的 ejb 3.1 在 web 项目中我只有一个 servlet。这个 servlet 在第一个 ejb 中调用简单的测试方法,然后在第二个 ejb 中调用。测试方法中的第一件事是通过此代码
对资源会话上下文进行依赖注入@Resource
private SessionContext context;
第一个 ejb 工作正常,但第二个(和任何后续的)return 会话上下文为空。这是完整的代码:
FirstServlet.java
@WebServlet("/FirstServlet")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
FirstEJB firstEJB = new FirstEJB();
SecondEJB secondEJB = new SecondEJB();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println(firstEJB.helloFirst());
out.println(secondEJB.helloSecond());
}
}
FirstEJB.java
@Stateless
public class FirstEJB {
@Resource
private SessionContext contextFirst;
public String helloFirst(){
System.err.println(contextFirst.toString());
return "Hello from FirstEJB";
}
}
SecondEJB.java
@Stateless
public class SecondEJB {
@Resource
private SessionContext contextSecond;
public String helloSecond(){
System.err.println(contextSecond.toString());
return "Hello from SecondEJB";
}
}
谁知道问题出在哪里。
使用注入的第一条规则是您的服务器(也称为 "container")创建您注入的对象。
在你的例子中,每个 EJB 实例的生命周期都在容器的完全控制之下。
在您的代码中,您创建的 firstEJB
实例被容器创建的另一个实例替换。 secondEJB
实例仍然是您创建的实例(它缺少 @EJB
注释),因此它没有受到适当的生命周期管理,也没有完全构建它的 @Resource
注入处理.
因此,对您的 servlet 代码进行简单更改:
@WebServlet("/FirstServlet")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
private FirstEJB firstEJB;
@EJB
private SecondEJB secondEJB;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println(firstEJB.helloFirst());
out.println(secondEJB.helloSecond());
}
}
应该会给你想要的结果。