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 ; )

0

ok, zrobilam szybki-maly przyklad. Jeden ws, z 1 metoda. Oraz 1 klasa (testDAO) do wstrzykniecia. Problemem jest to, ze konstruktor webserwisu tworzy sie 2 razy. I dopiero przy drugim wstrzkiwane jest testDAO. No i problem moj jest taki by konstruktor byl tworzony raz i by razem z tym nastapilo wstrzykniecie. wszystkiem xmle sa w w webapp/WEB-INF

Moze Ty bedziesz miec jakis pomysl..
pzdr

0

kurde nie moge wrzucic tu zippa :/

wiesz co no nie moge wrzucic to zipa, wyskakuje mi ciagle ze rozszerzenie "" nie jest akceptowalne ?! moze jakis bug na forum? bo kiedys dodawalam zipa bez problemu ... :///

0

Dobra, udalo sie, za 10 razem normalnie :)

0

ten obiekt musi byc jakos tworzony 2 razy. W web.xml mam go zdefiniowanego jako serwlet:

 	 <servlet>
		<servlet-name>TestWS</servlet-name>
		<servlet-class>test.ws.TestWS</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>TestWS</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping> 

potem jest w jboss-cxf.xml po raz drugi:

 
 	<jaxws:endpoint  id="TESTWS" address="http://localhost:8080/TestSWS" implementor="testWS">
		<jaxws:invoker>
			<bean class="org.jboss.wsf.stack.cxf.InvokerJSE" />
		</jaxws:invoker>

	</jaxws:endpoint> 

gdzie w applicationContext jest:

<bean id="testWS" class="test.ws.TestWS">
 	<property name="testDao" ref="testDAO" /> 
</bean> 

moze to o to chodzi? tylko ze jesli nie zdefiniuje jako servlet to w ogole nie jest dostepny.. Zauwazylam tez ze jesli z web.xml usune ContextLoaderListenera, czyli ten fragment:

 <listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

to sie utworzy tylko raz. tyle ze zaleznosci nie beda wstrzykniete, ehhh :(

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