2012-11-22 41 views
9

Tôi muốn bắt ngoại lệ khởi tạo bean trong mã của mình. Tôi có những lựa chọn nào? Một cách để làm điều này là sử dụng cấu hình chứa Java dựa trên:Mùa xuân - bắt đậu tạo ngoại lệ

@Configuration 
public class AppConfig { 
    @Bean 
    public SomeBean someBean() { 
    try { 
     return new SomeBean(); // throws SomeException 
    } catch(SomeException se) { 
     return new SomeBeanStub(); 
    } 
    } 
} 

Là có thể để xác định xử lý ngoại lệ cho instantiation đậu sử dụng Spring sử dụng cấu hình dựa trên XML hoặc chú thích dựa trên?

+0

Bạn có tìm cách để làm điều đó không? Tôi muốn nắm bắt nó, và giết chết quá trình, không để cho máy chủ tải tất cả. Vấn đề của tôi là nếu một số đậu không được nạp đúng cách, nhưng một số khác lại làm, bạn sẽ có một hành vi không nhất quán. –

Trả lời

0

Bạn không được phép làm điều đó. Đó là toàn bộ quan điểm của việc tạo ra một hạt đậu cho bạn. Nếu bạn muốn tạo hạt đậu của riêng mình bằng cách sử dụng new (như trên), tại sao lại sử dụng Spring để tạo hạt cho bạn?

Bạn thực sự có thể phân bổ đối tượng cho bản thân và công việc của bạn thay vì tiêm phụ thuộc và tất cả.

Mặc dù tôi hiểu bản chất đằng sau câu hỏi. Tôi nghĩ rằng nó là tốt nhất nếu nó không thành công trong thời gian tải máy chủ. Lý do: Ứng dụng sẽ không ở trạng thái không nhất quán. Giả sử bạn nắm bắt được ngoại lệ và làm một số sự sạch sẽ, nhưng các lớp khác sẽ mong đợi cho rằng đậu tồn tại mà nó không.

Do đó tốt nhất nó không thành công khi khởi tạo để ứng dụng nhất quán. Mặc dù tôi không biết bất kỳ cách hợp pháp nào khác để làm.

+0

Cảm ơn bạn. Ngữ cảnh câu hỏi là như sau: nếu một cái gì đó xấu xảy ra trong quá trình khởi tạo các bean (lỗi cơ sở dữ liệu, một lỗi bên ngoài khác), nó sẽ chuyển sang một số chế độ bảo trì. Nếu không có sự bắt buộc tạo ra ngoại lệ, điều đó là không thể. Bạn có thể vui lòng giải thích thêm về cách trình bao bọc có thể trợ giúp ở đây không? – khachik

+1

đã chỉnh sửa câu trả lời :) – Jatin

2

Chỉ để hoàn thành.

Bạn cũng có thể lười biếng bắt đậu và bắt ngoại lệ lần đầu tiên bạn sử dụng đậu.

mùa xuân config:

<bean id="a" class="A" lazy-init="true" /> 

Trong java:

import org.springframework.beans.factory.BeanCreationException; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Lazy; 

public class B { 

    @Autowired 
    @Lazy 
    A a; 

    public void foo(){ 
     try{ 
       a.foo(); 
     } catch (BeanCreationException e){ 
       // ignore if you want 
     } 
    } 
} 
8

Phương pháp someBean nên bắt SomeException và sau đó ném BeanCreationException với SomeException là nguyên nhân:

@Configuration 
public class AppConfig { 
    @Bean 
    public SomeBean someBean() { 
    try { 
     return new SomeBean(); // throws SomeException 
    } catch (SomeException se) { 
     throw new BeanCreationException("someBean", "Failed to create a SomeBean", se); 
    } 
    } 
} 
+0

Đây là cách phù hợp để thực hiện. – Alex

0

Trong trường hợp nếu bạn mong đợi thất bại trong thời gian một sáng tạo và bean không bắt buộc đối với phần còn lại của ứng dụng (tình huống khá hợp lý) bạn có thể làm như bạn đã gợi ý bằng cách bắt tất cả các ngoại lệ thất bại trong thân phương thức @Bean và trả về null để chỉ ra rằng việc tạo bean đã thất bại. Đậu sẽ không được thêm vào bối cảnh ứng dụng Spring trong trường hợp này và việc xây dựng bối cảnh sẽ thành công trong trường hợp nếu không có sự phụ thuộc bắt buộc trên bean đã cho.

Các vấn đề liên quan