Este es un proyecto Spring MVC con Hibernate. Estoy tratando de crear una clase Logger que sea responsable de ingresar los registros en la base de datos. Otras clases solo llaman a los métodos adecuados con algunos atributos y esta clase debería hacer toda la magia. Por naturaleza, debería ser una clase con métodos estáticos, pero eso causa problemas con el autoenvío del objeto dao.@autowired en clases estáticas
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);
}
}
Cómo hacer las cosas bien? ¿Qué debería hacer para no hacer que el objeto dao sea nulo? Sé que podría pasarlo como un parámetro de método, pero eso no es muy bueno. Supongo que el autoenlace no puede funcionar en objetos estáticos, porque se crearon para que el mecanismo de inicio automático no se haya creado todavía.
Interesante truco. Lo tendré en cuenta para el futuro :) –
El tipo de devolución del método DEBE ser nulo. http://docs.oracle.com/javaee/5/api/javax/annotation/PostConstruct.html –
Mucho tiempo después de la batalla, he venido a utilizar esta solución que funciona en su mayor parte. Pero la compañía Sonar rápidamente me dio una advertencia al respecto: 'Actualizar correctamente un campo estático desde un método no estático es complicado de corregir y podría dar lugar a errores si hay varias instancias de clases y/o múltiples hilos en juego. Lo ideal es que los campos estáticos solo se actualicen a partir de métodos estáticos sincronizados. Pensé que valía la pena mencionarlo. – MaxouMask