gpt4 book ai didi

java - 无法访问不同 Servlet 中的 SessionScoped 实体

转载 作者:行者123 更新时间:2023-12-01 11:04:39 24 4
gpt4 key购买 nike

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

这是我的 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. @SessionScoped 不注入(inject)实体。它只是声明注入(inject)的实体绑定(bind)到的范围。您也必须使用@Inject

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

我根本不会直接注入(inject)用户实体。
我建议编写一个包装类来容纳用户,例如

@SessionScoped
public class MySessionContext {
UserEntity userEntity;
public UserEntity getUserEntity() {return userEntity};
public void setUserEntity(UserEntity userEntity) {this.userEntity= userEntity};
}

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

您甚至可以注入(inject)内置 HttpSession :

@Inject
private HttpSession session;

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

关于java - 无法访问不同 Servlet 中的 SessionScoped 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33078643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com