gpt4 book ai didi

json - Spring MVC @Scope 代理 bean 和 Jackson 2

转载 作者:行者123 更新时间:2023-12-03 14:19:22 25 4
gpt4 key购买 nike

我正在尝试开发一个小的 Spring MVC 应用程序,我希望 User 对象从每个 session 的开始进行初始化。

我有用户类

@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyUser implements User {

// private fields
// getters and setters


public void fillByName(String username) {
userDao.select(username);
}

}

一旦 Spring Security 在拦截器类中识别出用户,我想初始化 MyUser 对象(顺便说一句,这是一个好习惯吗?)
public class AppInterceptor extends HandlerInterceptorAdapter {

@Autowired
MyUser user;

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

Authentication auth = SecurityContextHolder.getContext().getAuthentication();

if (!(auth instanceof AnonymousAuthenticationToken)) {
user.fillByName(auth.getName());
}

return true;
}
}

因此,当 Controller 处理请求时,已经有初始化 session 作用域的 User 类。但是当我尝试用 Jackson 序列化 MyUser 对象时,它不起作用:
@RequestMapping("/")
public String launchApp(ModelMap model) {

ObjectMapper mapper = new ObjectMapper();

try {
System.out.println(user.getUsername()); // Works good!
model.addAttribute("user", mapper.writeValueAsString(user)); // Doesn't work
} catch (JsonProcessingException e) {
// @todo log an error
}

return "app/base";
}

正如您所看到的,MyUser 对象 getter 在 Controller 类中运行良好,但 Jackson - 没有。

当我从 User 对象中删除 @Scope 注释时,Jackson 序列化开始工作。

显然,作用域代理 bean 和单例 Controller 类是问题所在

但我该如何解决呢?

——

更新

看起来我是第一个遇到这个的:)
也许这是糟糕的架构?我应该在 Controller 中创建 MyUser 类的新实例吗?通常的做法是什么?

最佳答案

我能想到的一种方法是添加另一个包装器:

@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyScopedUser implements User {

private MyUser myUser;
// private fields
// getters and setters


public void fillByName(String username) {
userDao.select(username);
}

public MyUser getMyUser() {
return this.myUser;
}
}

所以现在你的 MyScopedUser是一个作用域代理,但核心用户是一个普通类。您可以让用户退出并稍后编码:
mapper.writeValueAsString(scopeUser.getMyUser())

关于json - Spring MVC @Scope 代理 bean 和 Jackson 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29439528/

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