wstrzyknieta zaleznosc jest nie-null tylko w setterze

0

Czesc, mam dziwny problem. Wstrzykuje sobie bean, w applicationContext to jest tak:

	<bean id="bean1" class="com.test.Bean1">
		<property name="dataSource" ref="dataSource" />
	</bean>

	<bean id="bean2" class="com.test.Bean2">
		<property name="myBean1" ref="bean1" />
	</bean>
 

w klasie Bean2 mam:

 
private Bean1 myBean1;

public void setMyBean1(Bean1 myBean1){
  this.myBean1 = myBean1;
}

Problem jest taki ze jak w setterze sprawdze sobie czy myBean1 jest nullem to wychodzi ze nie (tzn po ustawieniu, czlyli po wywolaniu this.myBean1 = myBean1;) i moge na myBean1 wywolywac metody.
Ale jesli tylko dodam do Bean2 metoda jakas w ktorej bede chciala odwolywac sie do myBean1 to rzuca mi nullem,np:


public void testuje(){
  myBean1.jakasMetoda() // mBean1 jest nullem!
}
 

o co chodzi????

ps. moze ta informacja cos pomoze - Bean2 jest webservisem.

0

Może Ci się webservice tworzy więcej razy niż Tobie się zdaje. (zrób w @PostConstruct logowanie)
A bean1 jaki ma zasięg ?

0

Wiesz co, wyczytalam ze webservice traktuje settera jako metode webservicow'a i zeby wstrzykiwac przez konstruktor. Zrobilam prosty przyklad:

<constructor-arg index="0" value="3"/>

i konstruktor:

 
    public TestWS(int i){
        logger.info("TestWS KONSTRUKTOR "+i);
    }

ale mi sie sypie deploy, dostaje:
java.lang.InstantiationException

moze webservice nie moze miec konstruktora z argumentem?

0

Wiesz co, widze ze tworza mi sie 2 konstruktory i nie kumam czemu.. Jesli webservisu mojego nie zdefiniuje w applicationContext to tworzy mi sie jeden konsturktor (dodalam sobie logowanie w konstruktorze: System.out.println("KONSTRUKTOR WS"); wiec widze). Jesli tylko dodam moj webservice do applicationContext:

<bean id="testWS" class="com.test.TestWS">
</bean>
 

to "KONSTRUKTOR WS" wypluwa mi 2 razy.. czemu? :|

0

Na pewno musi mieć pusty (edit. znaczy musi mieć konstruktor bezparametrowy) - jest to logiczny wymóg, jako że w EE nie tworzysz instancji swoich beanów, a tworzy je sam system - dlatego konstruktor musi być bezargumentowy. Właściwie ta zasada dotyczy wszystkich beanów, nie tylko enterprise (w SE też tak jest:)

0

Pisaliśmy razem zdaje się.
Wiesz jestem trochę za tępy jeżeli chodzi o ee i sam nigdy nie deklarowałem beanów z pliku xml a za pomocą adnotacji - jakoś czytelniejsze i bardziej uporządkowane mi się to wydaje.
Pisząc, że tworzą Ci się 2 konstruktory, masz na myśli rozumiem, że 2 razy konstruktor jest wywoływany tak?

0

tak, dokladnie. Podam przyklad kodu, to jest ws:

 
public class TestWS implements ITestWS{

public TestWS(){
 logger.info("KONSTRUKTOR TestWS");
}


//metody webserwisu
public void test1(){}

public void test2(){}

} 

i w tym momencie, jedyne co chce zrobic to dodac ten webservice do applicationContext, na razie zapominamy o wstrzykiwaniu. Czyli pisze:

	<bean id="testWS" class="com.test.testWS">
	</bean>
 

i dodanie webservice jako bean powoduje ze dostane tekst z konstruktora "KONSTRUKTOR WS" 2 razy. Jesli zas nie bede definiowac webservisu jako bean to konstruktor bedzie wywolany tylko raz.

0

no to sprawdźmy może dlaczego tak się dzieje
do kosntruktora

Thread.dumpStack()
0

Wiesz co, mi sie wydaje ze TestWS sie wpierw rejestruje jako webservice (stad 1sze wywolanie konstruktora), zas potem jako bean ze spring'a (stad drugie wywolanie konstruktora). Ale jak te 2 rzeczy polaczyc (by sie konstruktor raz wywolal)to nie mam pojecia :/

0

misty, a jak to wystawiasz jako ws? Jaki to framework? Jak to jakis maly projekcik testowy to spakuj i wrzuc, bedzie latwiej ; )

1 użytkowników online, w tym zalogowanych: 0, gości: 1