gpt4 book ai didi

java - 在组件之间共享类的实例

转载 作者:行者123 更新时间:2023-12-01 19:56:54 27 4
gpt4 key购买 nike

所以我有一个 Spring Boot 应用程序。
我创建了一个从请求中获取 JWT token 的过滤器。然后(在同一个过滤器类中)我向另一个服务发出请求(使用 http get 和 JWT),并且我想将数据保存到 Autowiring 类。

然后在 Controller 类中我想访问该数据。
我找到了使用 threadlocal 和使用请求范围的解决方案。
但我认为最优雅、最 Spring 的做事方式如下:

模型类:

@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);
}

}

Controller 类:

@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 类单例(?)并使其可用于 Controller (如果过滤器失败,用户将无法访问 Controller ,因此我可以假设 AuthManagementUser 将始终拥有数据)。但目前当我在 Controller 内时 AuthManagementUser 对象为空...

感谢您的帮助!

最佳答案

我认为您的问题是由 @Scope@Autowire 混合引起的。所有用@Autowire注释的字段都是在相应的bean构建之后填充的,所以这是一次性的事情。在您的情况下,您希望根据请求替换 bean,这不是 @Autowired 的用途 (TBOMK)。

使用 @Scope 时,请尝试一下 @Resource(请参阅 https://www.baeldung.com/spring-bean-scopes)。

或者,您可以将类存储在 ThreadLocal 中。

关于java - 在组件之间共享类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59033785/

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