gpt4 book ai didi

java - 将自定义数据映射存储为 ServletContext 中的属性?

转载 作者:行者123 更新时间:2023-12-01 12:23:35 26 4
gpt4 key购买 nike

我正在寻找一种方法将一些数据从数据库加载到 HashMap 中,并使该映射可用于所有根资源类和一些其他提供程序类(更准确地说是 ContainerRequestFilter 的实现)。我找到并实现了一个解决方案,在该解决方案中,我执行查询并在 ServletContextListener 的 contextInitialized 方法中加载 map ,并将其设置为 ServletContext 属性:

@WebListener
public class ServletContextCaching implements ServletContextListener {

@Inject
private SomeBeanLocalInterface someBean;

@Override
public void contextDestroyed(ServletContextEvent sce) {
ServletContext context = sce.getServletContext();
context.removeAttribute("CUSTOM_DATA_MAP");

}

@Override
public void contextInitialized(ServletContextEvent sce) {

List<SomeEntity> someEntities = someBean.findAllActive();
Map<String, String> temp = new HashMap<String, String>();
for (SomeEntity e : someEntities) {
temp.put(e.getSomeKey(), e.getSomeValue());
}
ServletContext context = sce.getServletContext();
context.setAttribute("CUSTOM_DATA_MAP", temp);

}

}

在 servlet 上下文中存储自定义数据(即属性)并使其可供“每个人”使用是一种好的做法吗?将一些数据从 DB 加载到 REST 服务中的内存映射中的建议做法是什么?我很确定我不是第一个需要这个的人:)

最佳答案

存储具有应用程序范围的数据非常常见。您可以使用 ServletContext,但还有其他替代方案。正如 Ashley Frieze 已经评论过的那样,您可以使用一个 bean 实例并将其注入(inject)到需要的地方。这将是例如如果您使用 CDI,则为 @ApplicationScoped bean;如果您使用 EJB,则为 @Singleton bean。

如果您想要一个没有任何依赖项的纯 JAX-RS 解决方案,您可以使用 @Contextdescribed by Bill Burke 。这是示例的副本:

public class MyApplication extends Application {

public MyApplication(@Context Dispatcher dispatcher) {
MyClass myInstance = new MyClass();
dispatcher.getDefaultContextObjects().put(MyClass.class, myInstance);
}

}

您可以像这样注入(inject)您的类:

public void get(@Context MyClass myInstance) { ... }

如果您有大量数据需要存储分布式缓存,例如 infinispanhazelcast也可能是一种选择。但对于大多数用例来说可能会过大。

关于java - 将自定义数据映射存储为 ServletContext 中的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26503325/

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