2012-11-22 5 views
9

Chcę przechwycić wyjątki tworzenia instancji bean w moim kodzie. Jakie mam opcje? Jednym ze sposobów, aby to zrobić jest użycie konfiguracji kontenera Java opartego:Wyjątek tworzenia skryptów sprężystych

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

Czy jest to możliwe do określenia procedury obsługi wyjątku dla fasoli instancji przy użyciu Wiosna za pomocą konfiguracji oparty na XML lub adnotacji oparte?

+0

Czy znalazłeś sposób, aby to zrobić? Chciałbym go złapać i zabić proces, nie pozwolić serwerowi załadować wszystkiego. Mój problem polega na tym, że jeśli jakiś komponent bean nie jest poprawnie załadowany, a inni to robią, pojawia się niespójne zachowanie. –

Odpowiedz

0

Nie należy tego robić. Na tym właśnie polega fakt, że Spring ma dla ciebie fasolę. Jeśli chcesz stworzyć własną fasolę używając new (jak wyżej), dlaczego warto użyć Springa, aby stworzyć fasolę dla ciebie?

Rzeczywiście można przydzielić obiekt dla siebie i pracować razem zamiast zastrzyku zależności i wszystkiego.

Chociaż rozumiem istotę tego pytania. Myślę, że najlepiej jest, jeśli zawiedzie podczas ładowania serwera. Powód: aplikacja nie będzie w stanie niespójności. Powiedzmy, że łapiesz wyjątek i robisz czystość, ale inne klasy będą oczekiwały, że ta fasola będzie istniała, a nie będzie.

Dlatego najlepiej nie powiedzie się podczas inicjalizacji, aby aplikacja była spójna. Chociaż nie znam żadnego innego uzasadnionego sposobu działania.

+0

Dziękuję. Kontekst pytania jest następujący: jeśli coś złego dzieje się podczas tworzenia ziaren (błąd bazy danych, inne zewnętrzne błędy), to powinien przełączyć się w tryb konserwacji. Bez wychwytywania wyjątków tworzenia ziarna nie jest to możliwe. Czy mógłbyś bardziej szczegółowo opisać, w jaki sposób otoki mogą pomóc? – khachik

+1

edytował odpowiedź :) – Jatin

2

Tylko dla kompletności.

Możesz także leniwy zainicjować komponent bean i wychwycić wyjątek przy pierwszym użyciu komponentu bean.

wiosna config:

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

w Javie:

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

Metoda someBean powinien złapać SomeException a następnie rzucać BeanCreationException z SomeException jako przyczynę:

@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

To jest właściwa droga to zrobić. – Alex

0

W przypadku, jeśli spodziewać się awarii w czasie Kreacja i komponent bean nie są obowiązkowe dla pozostałej części aplikacji (całkiem uzasadniona sytuacja) możesz zrobić tak, jak zasugerowałeś, wychwytując wszystkie wyjątki niepowodzenia w obiekcie metody @Bean i zwracając null, aby wskazać, że tworzenie komponentu bean nie powiodło się. W tym przypadku komponent bean nie zostanie dodany do kontekstu aplikacji Spring, a budowa kontekstu zakończy się powodzeniem w przypadku braku obowiązkowych zależności w danym komponencie bean.