gpt4 book ai didi

java - Struts 2 + Spring 在 session 中放置一个托管的 spring bean

转载 作者:行者123 更新时间:2023-11-30 08:44:33 25 4
gpt4 key购买 nike

考虑一个 Struts 2 + Spring 4 项目。

对于每次登录,User 对象都被放入 session 中。作为一个非常简单的 Action ,它将看起来

public class LoginProcess implements ServletRequestAware {

@Inject
private AuthenticationServices authenticationServices;

public String execute() {
//The login method makes a new User and fills its setters
User newUser = authenticationServices.login(....);
getServletRequest().getSession().setAttribute("USER_SESSION", user);
}
}

因为我们手动创建了一个新的 User 对象,所以它不是托管的 spring bean,我们不能在 User 类中使用 spring 特性:@Inject , @Value ,...

我尝试将用户更改为:

@Named
@Scope(value="session")
public class User { ...
@Inject
private AccountServices accountServices;

}

并注入(inject) User 而不是调用 new User,但我收到错误:

Caused by: java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131)
at org.springframework.web.context.request.SessionScope.get(SessionScope.java:91)

虽然它描述了错误,但我找不到如何修复它,而且我完全不确定这是否是正确的方法。似乎我只能在使用 spring mvc

时使用 spring session scope

有什么意见吗?!


为什么我需要这个?! (简化情况)

用户对象有一个getAccounts() 方法可以获取所有用户账户。获取用户帐户是一项昂贵的操作,并且用户在登录期间可能不需要其帐户。

因此,我们不是在用户登录后立即获取用户帐户,而是让 get 方法在没有用户帐户的情况下获取用户帐户:

public class User() {
private Accounts accounts;

@Inject
private AccountServices accountServices;

Accounts getAccounts() {
if (accounts == null) {
accounts = accountServices.getUserAccountsFromDB(...)
}
return accounts;
}

最佳答案

不要自己创建一个新的 User 实例,而是从 Spring 上下文中获取一个 bean。

例如,您可以通过实现 ApplicationContextAware 接口(interface)并调用其中一个 getBean 方法来实现它。

User user = applicationContext.getBean(User.class);
// populate user and put it into session

这样它就是一个 Spring 管理的 bean,应该注入(inject)所有必需的属性。

但请考虑将您的 User 更改为简单的 POJO 并将所有业务逻辑(例如获取用户帐户)移动到更合适的位置,这样您的模型层将更加清晰且易于测试。

关于java - Struts 2 + Spring 在 session 中放置一个托管的 spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33736957/

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