想象一下,我有一个网络应用程序。在某些时候,您可以选择一个客户端。然后,您可以创建特定于当前客户端的昂贵对象,例如所有订单的列表。
我有构建这些对象的提供程序,但由于它们很昂贵,我想将它们与客户端一起缓存在会话中。这有效,直到我选择下一个客户端。现在我有了一个新的客户,但订单仍然是前一个客户的订单。
如何在客户端更改时从会话中删除这些对象?
我当前的实现使用注释@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;在会话中创建的范围。但是,我如何将子范围同步到会话和客户端?