java - 在组件之间共享一个类的实例
问题描述
所以我有一个弹簧启动应用程序。
我创建了一个从请求中获取 JWT 令牌的过滤器。然后(在同一个过滤器类中)我向另一个服务发出请求(使用带有 JWT 的 http get),我想将数据保存到自动装配类。
然后在控制器类中我想访问该数据。
我找到了一个使用 threadlocal 并使用请求范围的解决方案。
但我认为最优雅,最有春天的做事方式如下:
型号类:
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
@Scope(value="request", proxyMode= ScopedProxyMode.TARGET_CLASS)
public class AuthManagementUser implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String username;
private String name;
private String lastname;
private String email;
private AuthManagementOrgs[] organizations;
过滤器类:
@Component
@Order(1)
public class RequestFilter implements Filter {
@Autowired
RestTemplateInterceptor token;
@Autowired
UserService userService;
@Autowired
AuthManagementUser amUser;
// filter for catching authorization token before processing request and saving
// it in a scope request in case of request from this microservice
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (((HttpServletRequest) request).getHeader("authorization") != null){
token.setToken(((HttpServletRequest) request).getHeader("authorization"));
this.amUser = userService.retrieveUserDataAuthManagementMock();
}
chain.doFilter(request, response);
}
}
控制器类:
@RestController
@RequestMapping(value = "user", name = "User")
public class UserController {
@Autowired
LdapUserRepository ldapUserRepository;
@Autowired
UserService userService;
@Autowired
AuthManagementUser amUser;
@RequestMapping(value = "", method = RequestMethod.GET)
public ArrayList<LdapUserModel> User()
{
return this.userService.checkCreate(this.amUser);
}
如您所见,我想让 AuthManagementUser 类单例(?)并使其可用于控制器(如果过滤器失败,用户无法访问控制器,因此我可以假设 AuthManagementUser 将始终拥有数据)。但是目前当我在控制器内部时,AuthManagementUser 对象为空......
感谢帮助!
解决方案
我认为你的问题是由混合引起@Scope
的@Autowire
。所有带注解的字段@Autowire
都是在构建对应的bean之后填充的,所以是一次性的。在您的情况下,您希望每个请求都替换 bean,这不是@Autowired
(TBOMK)的意思。
使用时@Scope
,@Resource
请尝试一下(请参阅https://www.baeldung.com/spring-bean-scopes)。
或者,您可以将类存储在ThreadLocal
.
推荐阅读
- entity-framework-core - 使用 EF Core Fluent API 与两个相同类型的实体映射关系
- slack-api - 当我们的机器人用户/应用程序被添加/邀请到客户端松弛通道时,我应该听哪个事件
- swift - 我可以跳过填写函数的默认值吗?
- jquery - 通过 Aurelia 中的 HTML DIV 基础捕获 KeyCode 和触发事件
- excel - Wonderware 历史标签
- sql - 影响表的活动对象
- c# - 从使用 GemBox 正确格式化的文本文件中获取 PDF 文档时遇到问题
- vue.js - 如何在vue中查找对象长度
- javascript - 为什么 console.log 的位置会导致循环解构数组崩溃?
- javascript - “member.guild.username”在消息中显示为“未定义”