根据特定对象的状态

时间:2016-07-07 10:28:54

标签: java session dependency-injection guice session-state

想象一下,我有一个网络应用程序。在某些时候,您可以选择一个客户端。然后,您可以创建特定于当前客户端的昂贵对象,例如所有订单的列表。

我有构建这些对象的提供程序,但由于它们很昂贵,我想将它们与客户端一起缓存在会话中。这有效,直到我选择下一个客户端。现在我有了一个新的客户,但订单仍然是前一个客户的订单。

如何在客户端更改时从会话中删除这些对象?

我当前的实现使用注释@ClientScoped。当在UI中选择新客户端时,我遍历会话中的所有对象,获取类并检查注释:

private void currentClientChanged(Client newClient) {
    Session session = getSession(); // Get HTTP session

    Set<String> toRemove = new HashSet<>();

    for (Map.Entry<String, Object> entry: session.getAttributes().entrySet()) {
        ClientScoped ann = inst.getClass().getAnnotation(ClientScoped.class);
        if (ann != null) {
            toRemove.add(entry.getKey());
        }
    }

    log.debug("Removing client scoped objects from session: {}", toRemove);
    for(String name: toRemove) {
        session.removeAttribute(name, true);
    }
}

我不喜欢这种方法,因为它容易出错。如果我忘记了注释,在测试过程中很容易错过这个问题。

这就是为什么我想知道是否有更聪明的解决方案,也许是真正的&#34;客户&#34;在会话中创建的范围。但是,我如何将子范围同步到会话和客户端?

0 个答案:

没有答案