Đây là một dự án Spring MVC với Hibernate. Tôi đang cố gắng tạo một lớp Logger, chịu trách nhiệm nhập các bản ghi vào cơ sở dữ liệu. Các lớp khác chỉ gọi các phương thức thích hợp với một số thuộc tính và lớp này nên làm tất cả các phép thuật. Bởi bản chất nó phải là một lớp với các phương pháp tĩnh, nhưng điều đó gây ra vấn đề với đối tượng dao autowiering.@autowired trong các lớp tĩnh
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);
}
}
Làm cách nào để làm đúng? Tôi nên làm gì để không làm cho đối tượng dao rỗng? Tôi biết rằng tôi có thể vượt qua nó như là một tham số phương pháp, nhưng điều đó không phải là rất tốt. Tôi đoán rằng autowired không thể làm việc trên các đối tượng tĩnh, bởi vì chúng được tạo ra sớm để autowiering cơ chế chưa được tạo ra.
Thú vị lừa. Tôi sẽ ghi nhớ điều đó trong tương lai :) –
Kiểu trả về của phương thức PHẢI bị vô hiệu. http://docs.oracle.com/javaee/5/api/javax/annotation/PostConstruct.html –
Lâu sau trận chiến, tôi đã sử dụng giải pháp này hoạt động tốt nhất. Nhưng công ty Sonar đã nhanh chóng đưa ra một cảnh báo về nó: 'Cập nhật chính xác một trường tĩnh từ một phương thức không tĩnh là khó để có được quyền và có thể dễ dàng dẫn đến lỗi nếu có nhiều phiên bản lớp và/hoặc nhiều luồng trong khi chơi. Lý tưởng nhất, các trường tĩnh chỉ được cập nhật từ các phương thức tĩnh được đồng bộ hóa. ”Tôi nghĩ rằng nó xứng đáng đề cập đến nó. – MaxouMask