2014-10-22 129 views
0

我正在尋找一種方法將數據從數據庫加載到HashMap中,並使所有根資源類和一些額外的提供程序類(ContainerRequestFilter的實現更精確)都可用。我發現,實現,其中我執行查詢並的ServletContextListener的contextInitialized方法中加載地圖,並將其設置爲ServletContext屬性的溶液:將自定義數據映射存儲爲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中上下文,從而使其可用於「所有人」?將REST服務中的一些數據從DB加載到內存映射中的建議做法是什麼?我很確定我不是第一個需要這個:)

+0

我不認爲它應該在servlet中。你應該有一個包含這些數據的bean的單例實例,它可以被注入任何需要它的服務。 bean本身需要注入數據源,以便它在構建時可以讀取它。如果你看看你的注入框架如何構造單例,你可能會發現答案會消失。 – 2014-10-22 08:49:00

回答

1

用應用程序範圍存儲數據是非常普遍的。您可以使用ServletContext,但還有其他選擇。正如Ashley Frieze已經評論過的,你可以使用一個bean的實例並在需要的地方注入它。這將是例如如果使用EJB,則使用CDI或@Singleton bean,則爲@ApplicationScoped bean。

如果您想要一個純粹的JAX-RS解決方案而無任何依賴關係,您可以使用@Context,如described by Bill Burke。下面是該示例的副本:

public class MyApplication extends Application { 

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

} 

可以比注入類是這樣的:

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

如果你有大量的數據存儲分佈式緩存像infinispan或可能hazelcast也是一個選擇。但是對於大多數用例來說可能會過大。

+0

感謝您的意見。 @Ashley Frieze,也謝謝你。我喜歡第一種選擇 - 創建一個應用程序範圍的bean並在需要的地方注入它。但是,雖然這對於根資源類很好,但我無法在實現ContainerRequestFilter的類中使用它。注入變量(應用程序作用域bean的實例)在此過濾器中始終爲空。 – joca 2014-10-22 13:08:15

+0

這是爲我工作。你的過濾器註釋爲「@ Provider」嗎? – lefloh 2014-10-22 16:00:36

+0

它被註釋爲@Provider,但注入的變量爲空。它肯定會工作,必須有一個特定於我的項目的問題。這是我現在的問題,我會發現錯誤。關於這裏的問題,回答(提供了意見和備選方案)。感謝您的幫助和建議。 – joca 2014-10-23 10:37:19