无法访问其他Servlet中的SessionScoped实体

时间:2015-10-12 10:16:46

标签: java java-ee

我遇到了这个问题,我无法访问两个不同Servlet中的SessionScoped实体。在SetServlet中,它正确设置SessionScoped实体,并在刷新页面时仍然设置它。在我的GetServlet上,它始终设置为空。

以下是SetServlet的代码:

@WebServlet("/set")
public class SetServlet extends HttpServlet {
    @Inject
    UserService userService;

    @SessionScoped
    UserEntity userEntity;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        userEntity = userService.getUserById(1);
    }
}

以下是GetServlet中的代码:

@WebServlet("/get")
public class GetServlet extends HttpServlet {
    @Inject
    UserService userService;

    @SessionScoped
    UserEntity userEntity;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        if(null != userEntity) {
            // do stuff
        }
    }
}

以下是userService的代码:

@RequestScoped
public class UserService {
    @PersistenceContext(unitName = "unitName")
    EntityManager em;

    @Inject
    UserTransaction tx;

    public UserEntity getUserById(Integer id) {
        TypedQuery<UserEntity> query = em.createQuery("SELECT user from UserEntity user where user.id = :id", UserEntity.class)
            .setParameter("id", youtubeChannelId);
        List<UserEntity> queryResultList = query.getResultList();
        if(queryResultList.size() > 0) {
            return queryResultList.get(0);
        } else {
            return null;
        }
    }
}

抱歉我的英语不好。

感谢任何帮助 - 非常感谢!

1 个答案:

答案 0 :(得分:1)

两点:

  1. @SessionScoped不会注入实体。它只是声明了注入的实体所绑定的范围。您也必须使用@Inject

  2. 通过使用作业userEntity = userService.getUserById(1);,您可以绕过CDI。您创建的实体不以这种方式管理,无法分发 它与/set - Servlet一起工作两次的原因是因为Servlet实例被EE容器重用。
    您可以通过在/set userEntity.setUser(...)中设置您想要注入的实体的值来解决该问题。但这可能会导致JPA出现问题。更好的解决方案是使用CDI制作人,但是你仍然需要以某种方式传递用户的ID。

  3. 我根本不会直接注入用户实体。
    我建议写一个包含类似

    的用户的包装类
    @SessionScoped
    public class MySessionContext {
        UserEntity userEntity;
        public UserEntity getUserEntity() {return userEntity};
        public void setUserEntity(UserEntity userEntity) {this.userEntity= userEntity};
    }
    

    然后,您可以注入该类并在其中设置/获取userEntity。

    您甚至可以注入内置HttpSession

    @Inject
    private HttpSession session;
    

    您可以通过getAttribute / setAttribute - 方法获取/设置会话用户。