To jest projekt Spring MVC z Hibernate. Próbuję utworzyć klasę Logger, która jest odpowiedzialna za wprowadzanie dzienników do bazy danych. Inne klasy po prostu wywołuj właściwe metody z pewnymi atrybutami i ta klasa powinna robić całą magię. Z natury rzeczy powinna być klasą ze statycznymi metodami, ale powoduje to problemy z autowirowaniem obiektu dao.@autowired w klasach statycznych
public class StatisticLogger {
@Autowired
static Dao dao;
public static void AddLoginEvent(LogStatisticBean user){
//TODO code it god damn it
}
public static void AddDocumentEvent(LogStatisticBean user, Document document, DocumentActionFlags actionPerformed){
//TODO code it god damn it
}
public static void addErrorLog(Exception e, String page, HashMap<String, Object> parameters){
ExceptionLogBean elb=new ExceptionLogBean();
elb.setStuntDescription(e);
elb.setSourcePage(page);
elb.setParameters(parameters);
if(dao!=null){ //BUT DAO IS NULL
dao.saveOrUpdateEntity(elb);
}
}
Jak to naprawić? Co mam zrobić, aby obiekt dao nie był pusty? Wiem, że mogę przekazać go jako parametr metody, ale to nie jest bardzo dobrze. Zgaduję, że autowired nie może działać na statycznych obiektach, ponieważ są one tworzone na wczesnym etapie, do mechanizmu automatycznego dodawania nie jest jeszcze stworzony.
Ciekawe sztuczka. Będę o tym pamiętać na przyszłość :) –
Typ zwrotu metody MUSI być nieważny. http://docs.oracle.com/javaee/5/api/javax/annotation/PostConstruct.html –
Długo po bitwie, skorzystałem z tego rozwiązania, które działa w większości przypadków. Ale firma Sonar szybko dała mi ostrzeżenie: "Prawidłowe uaktualnienie pola statycznego z metody niestatycznej jest trudne do uzyskania i może prowadzić do błędów, jeśli istnieje wiele instancji klasy i/lub wiele wątków w grze. Najlepiej byłoby, gdyby pola statyczne były aktualizowane tylko ze zsynchronizowanych metod statycznych. "Myślałem, że warto o tym wspomnieć. – MaxouMask