在组件之间共享类的实例

时间:2019-11-25 14:13:04

标签: java spring filter autowired

所以我有一个Spring Boot应用程序。
我创建了一个过滤器,该过滤器从请求中获取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类为singleton(?)并使其对控制器可用(如果过滤器失败,用户将无法访问控制器,因此我可以假设AuthManagementUser将始终具有数据)。但是目前,当我在控制器内部时,AuthManagementUser对象为null ...

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我认为您的问题是由@Scope@Autowire混合引起的。在构造相应的bean之后,所有用@Autowire注释的字段都将被填充,因此这是一次性的。在您的情况下,您想按请求替换Bean,而这不是@Autowired对(TBOMK)的含义。

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

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