从Servlet和会话Bean

时间:2016-03-18 15:50:13

标签: java java-ee cdi wildfly-8

我已经看到SO中有几个类似的问题,但没有一个真正帮助过我。

直截了当,我正在Eclipse中工作,我在Wildfly8上部署了一个具有这种结构的EAR:

  • ZeroCDI ,一个带有此类的java独立项目

    @SessionScoped
    public class MyUser implements Serializable{
        private static final long serialVersionUID = -8247101999419229162L;
        private String name;
    
        public void setAndPrintName(String name) {
            System.out.println("Object = "+this);
            System.out.println("Old name = "+this.name);
            this.name = name;
            System.out.println("New name = "+this.name);
        }
    }
    
  • ZeroWEB :耳朵的网络模块,其中 ZeroCDI 已添加到部署程序集部分中。它有这个唯一的servlet

    @WebServlet("/ZeroServlet")
    public class ZeroServlet extends HttpServlet {
        ...
        @Inject MyUser user;
        @EJB UserService userService;
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            user.setAndPrintName("foo");
            userService.setCurrentUser("bar");
        }
        ...
    }
    
  • ZeroEJB :ear的EJB模块,其中 ZeroCDI 添加到Deployment Assembly部分。它只有这个EJB

    @Stateless
    @LocalBean
    public class UserService {
    
        public UserService() {}
    
        @Inject MyUser user;
        public void setCurrentUser(String username){
            user.setAndPrintName(username);
        }
    
    }
    
  • ZeroEAR :包含两个模块(WEB和EJB)和库 ZeroCDI.jar

  • 的存档

运行应用程序我可以看到servlet和ejb没有引用同一个对象:

16:19:50,674 INFO  [stdout] (default task-2) Object = nets.devsedge.beans.MyUser@596ab996
16:19:50,674 INFO  [stdout] (default task-2) Old name = null
16:19:50,674 INFO  [stdout] (default task-2) New name = foo
16:19:50,701 INFO  [stdout] (default task-2) Object = nets.devsedge.beans.MyUser@579a2f59
16:19:50,702 INFO  [stdout] (default task-2) Old name = null
16:19:50,702 INFO  [stdout] (default task-2) New name = bar

为什么会这样?不应该通过整个应用程序在同一会话中共享我的会话范围bean实例吗?为什么在EJB中注入新实例呢?

0 个答案:

没有答案