2012-01-17 19 views
8

Chúng ta có một tình huống mà Spring của chúng ta nối một số bean bao gồm các lớp ActiveMQ được xây dựng bằng Java 6. Ứng dụng của chúng ta chạy trên các máy chủ của khách hàng, vì vậy chúng tôi không thể đảm bảo rằng chúng đã cài đặt Java 6 hoặc mới hơn. Nếu chúng xảy ra có Java 5, ứng dụng không thể khởi động vì BeanCreationException s với các lớp phụ thuộc vào ActiveMQ (nguyên nhân gốc là UnsupportedClassVersionError).Tôi có thể bỏ qua BeanCreationException và tiêm null không?

Vì vậy, câu hỏi của tôi là, có cách nào để bỏ qua BeanCreationException và vẫn khởi động ứng dụng không? Tôi muốn có thể hiển thị một thông báo lỗi nói rằng họ cần phải cài đặt Java 6 hoặc mới hơn, nhưng kể từ khi ứng dụng thậm chí không thể bắt đầu, tôi không bao giờ có cơ hội để làm điều này.

Linh cảm của tôi là không có cách nào để làm điều này, vì Spring cần có khả năng đảm bảo rằng ứng dụng của tôi được xây dựng đúng sau khi khởi tạo, nhưng tôi nghĩ tôi sẽ hỏi. Bất kỳ đề xuất nào khác về cách hoàn thành mục tiêu cuối cùng của tôi cũng sẽ hữu ích và được đánh giá cao.

Chúng tôi đang sử dụng Spring 3.0.6

Cảm ơn!

Trả lời

0

Trước hết, bất kỳ vật ném nào là lớp con của java.lang.Error thường được coi là không thể khôi phục. Vì vậy, trong khi nó có thể bắt chúng, it's strongly discouraged:

Một Error là một lớp con của Throwable cho biết vấn đề nghiêm trọng mà một ứng dụng hợp lý không nên cố gắng nắm bắt. Hầu hết các lỗi như vậy là điều kiện bất thường.

Tuy nhiên, nếu tất cả những gì bạn định làm là hiển thị thông báo lỗi thì bạn sẽ có thể thoát khỏi nó.

SO để quay lại câu hỏi của bạn, tôi đề xuất creating an implementation giao diện FactoryBean của Spring, sẽ cố tải các lớp ActiveMQ. Nếu nó hoạt động, nó có thể trả về đối tượng thích hợp từ FactoryBean.getObject. Nếu nó không thành công (thông qua số bị bắt UnsupportedClassVersionError), thì nó có thể trả về số null hoặc một số đối tượng khác đại diện cho điều kiện đó.

+0

Cảm ơn, điều này có vẻ phù hợp với tôi. Tôi đã chọn câu trả lời này vì nó là lần đầu tiên đề xuất FactoryBean, và không yêu cầu tôi nâng cấp Spring. –

4

Nếu bạn có thể nâng cấp lên mùa xuân 3.1 (ổn định), tận dụng lợi thế của cấu hình Java:

@Bean 
public SomeBean public someBean() { 
    if(isEverythingOkWithJavaVersion()) { 
     return new CorrectBean(); 
    } else { 
     return null; 
    } 
} 

hay:

@Bean 
public SomeBean public someBean() { 
    try { 
     return new CorrectBean(); 
    } catch(UnsupportedClassVersionError e) { 
     log.warn("", e); 
     return null; 
    } 
} 

Trong các phiên bản cũ của mùa xuân FactoryBean có thể được sử dụng để thực hiện cùng một logic. Thay vì trả lại null bạn cũng có thể trả về một số triển khai giả mạo mà bạn có thể khám phá sau và cảnh báo người dùng khi ứng dụng cố gắng sử dụng nó.