我遇到了这个问题,我无法访问两个不同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;
}
}
}
抱歉我的英语不好。
感谢任何帮助 - 非常感谢!
答案 0 :(得分:1)
两点:
@SessionScoped
不会注入实体。它只是声明了注入的实体所绑定的范围。您也必须使用@Inject
。
通过使用作业userEntity = userService.getUserById(1);
,您可以绕过CDI。您创建的实体不以这种方式管理,无法分发
它与/set
- Servlet一起工作两次的原因是因为Servlet实例被EE容器重用。
您可以通过在/set
userEntity.setUser(...)
中设置您想要注入的实体的值来解决该问题。但这可能会导致JPA出现问题。更好的解决方案是使用CDI制作人,但是你仍然需要以某种方式传递用户的ID。
我根本不会直接注入用户实体。
我建议写一个包含类似
@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
- 方法获取/设置会话用户。