yup, forgot to mention: please do not apply the patch to SVN yet, this is only ment for looking at the XMLs.
LieGrue, strub --- Mark Struberg <[email protected]> schrieb am Do, 15.1.2009: > Von: Mark Struberg <[email protected]> > Betreff: Re: XML definition for constructor injection > An: [email protected] > Datum: Donnerstag, 15. Januar 2009, 20:28 > I had long night yesterday and like to share my outcome. > > First, big thanks to Gurkan again for being so patient with > me yesterday ;) > > Oki, here is what I guess is the answer to my question in > form of a patch. I reread the spec and somehow I have the > gut feeling that either I still do not understand it fully > (most probably) or the spec is still a bit inconsistent or > we do have something missing in the implementation yet. E.g. > we currently do not allow Enums, <Array> and > primitive wrapper classes like java.lang.Integer in > constructor injection. Whereas the spec states that > > 10.3.3. Bean constructor declarations -> 10.6 > > 10.6 Injection point declarations -> 10.8 > > 10.8 Specifying bean types and bindings > > • an element that represents a Java class or > interface, > > or <Array> ... > > The spec says nothing about real primitive types like int > though. But this would perfectly make sense to me, like one > may have an existing service which has to be filled. And all > the needed functionality is already there for the field > injection. > > Please review the XMLs in the patch if I interpreted the > spec correctly! > > status so far: > .) The example with invoking > TstBeanConstructor(CtParameter) works > .) I have a patch for making the > TstBeanConstructor(Integer) work, but it's pretty ugly, > so I will only work on this if you confirm that this use > case should work according to the spec. > .) I'm not sure if TstBeanConstructor(int,int) is ok > for the spec. Doesn't work anyway ;) > > > Another thing I was not really aware of: > > XML-based bean declarations define additional > beans—they do not > > redefine or disable any bean that was declared via > annotations. > I always thought the XML based may redefine the beans > behaviour. E.g. if one bean has a standard scope, I may > override the scope via XML. Or I may change the injection of > a service used on a production server. This would really be > handy in praxis! > > txs, > strub > > --- Mark Struberg <[email protected]> schrieb am Mi, > 14.1.2009: > > > Von: Mark Struberg <[email protected]> > > Betreff: Re: XML definition for constructor injection > > An: [email protected] > > Datum: Mittwoch, 14. Januar 2009, 22:56 > > Here is an example of what I like to have: > > > > Let's assume I have a _given_ > my.company.ConfigService > > (and I don't even have the sources) which has NO > default > > constructor: > > > > public class ConfigService { > > private int val1=0, val2=0; > > public ConfigService(int ctParam) { val1=100*ctParam; > } > > public setVal2(int val2) { this.val2=val2; } > > public getVal1... > > } > > > > And I like to have the ConfigService as singleton with > name > > "cfgSvc" defined via XML (since there is > > annotation in the given source). > > > > The initialisation should be: > > 1.) create the ConfigService via it's constructor > and > > ctParam=42 > > 2.) call setVal2(666); > > > > > > See what I mean? Is this even possible with the > > 'flat' structure in the samples of the spec? > This > > would not allow to additionally set a value for val2, > or did > > I confuse something? > > > > How must the XML look like according to the spec? > > > > txs and LieGrue, > > strub > > > > > > --- Mark Struberg <[email protected]> schrieb am > Mi, > > 14.1.2009: > > > > > Von: Mark Struberg <[email protected]> > > > Betreff: Re: XML definition for constructor > injection > > > An: [email protected] > > > Datum: Mittwoch, 14. Januar 2009, 11:32 > > > Hi Gurkan! > > > > > > > the immediate children of the XML bean > > declaration > > > I also understood it this way when I first read > the > > spec. > > > > > > from the spec: > > > > For a simple bean defined using XML, the > bean > > > constructor may be > > > > specified by listing the parameter types of > the > > > constructer, in > > > > order, as direct children of the element > that > > declares > > > the bean. > > > > > > But on the other hand it was not really clear to > me if > > the > > > examples given in the spec are _with_ or > _without_ the > > bean > > > declaration itself (outer > > <myapp:TstBeanConstructor> > > > in my example)! > > > > > > If we interpret it your way, then no > 'mixed' > > > scenario like the following would work: > > > > > > I like to have a @Named(value="config") > > > @SessionScoped TstBeanConstructor PLUS I like to > > inject the > > > value 7 in setI2. > > > > > > How can this be achieved if there is no > separation > > between > > > the constructor parameters and the additionally > > injected > > > ones? > > > > > > Maybe this is not needed? Or it's a > shortcoming of > > the > > > spec? Or I'm completely confused? :) > > > > > > How I would write the XML (assuming a ct public > > > TstBeanConstructor(int ctParam) { ... ): > > > > > > <myapp:TstBeanConstructor> > > > <Named>config</Named> > > > <SessionScoped/> > > > <myapp:TstBeanConstructor> > > > > <myapp:ctParam>42</myapp:ctParam> > > > > > > > > </myapp:TstBeanConstructor> > > > <myapp:i2>7</myapp:i1> > > > </myapp:TstBeanConstructor> > > > > > > LieGrue, > > > strub > > > > > > > > > --- Gurkan Erdogdu > <[email protected]> > > schrieb > > > am Mi, 14.1.2009: > > > > > > > Von: Gurkan Erdogdu > > <[email protected]> > > > > Betreff: Re: XML definition for constructor > > injection > > > > An: [email protected] > > > > Datum: Mittwoch, 14. Januar 2009, 8:14 > > > > Hi Mark; > > > > > > > > Your XML definition is not correct, I think. > > > Specification > > > > says that, the immediate children of the XML > bean > > > > declaration which correspond to *Java Type* > is > > > captured as > > > > a *parameters* of this constructor. So the > > correct XML > > > > definition may be written as; > > > > > > > > <myapp:TstBeanConstructor> > > > > <RequestScoped/> > > > > <lang: Integer/> > > > > </myapp:TstBeanConstructor> > > > > > > > > where *lang* is the namespace that > corresponds to > > the > > > > *java.lang* package. You are able to give > any > > > namespace > > > > instead of *lang*. > > > > > > > > When the container creates this bean > instance, it > > will > > > > inject the constructor parameter with > looking the > > > beans with > > > > API type *Integer* and Binding Type > *...@current*. > > If it > > > finds > > > > the bean successfully, it injects its > current > > > instance. > > > > > > > > For example, lets say that we define > producer > > method > > > in > > > > other bean class (MyOtherBean) . > > > > > > > > class MyOtherBean > > > > { > > > > > > > > @RequestScoped @Produces > > > > public int > getTstBeanConstructorInitialValue() > > > > { > > > > return 12; > > > > } > > > > } > > > > Then, container calls this method via its > parent > > bean > > > > instance (MyOtherBean) and injects the > resulted > > > instance > > > > (Integer:12) into the TstBeanConstructor. > > > > > > > > I did not try to execute this sample, but I > think > > it > > > works. > > > > > > > > Please look at the specification that > contains > > full > > > > explanation of the XML defined constructor > > > declaration. > > > > > > > > /Gurkan > > > > > > > > > > > > > > > > > > > > ________________________________ > > > > From: Mark Struberg > <[email protected]> > > > > To: [email protected] > > > > Sent: Tuesday, January 13, 2009 10:51:43 PM > > > > Subject: XML definition for constructor > injection > > > > > > > > > > grr, my first mail got eaten by the spam > daemon > > > > > > > > > > > > --- Mark Struberg <[email protected]> > > schrieb am > > > Di, > > > > 13.1.2009: > > > > > > > > > Von: Mark Struberg > <[email protected]> > > > > > Betreff: > > > > > An: > [email protected] > > > > > Datum: Dienstag, 13. Januar 2009, 21:46 > > > > > Hi! > > > > > > > > > > I like to test the constructor > injection via > > XML > > > > > definition. > > > > > > > > > > For what I understand after reading the > > spec, the > > > > following > > > > > should work: > > > > > > > > > > Assume we have the WebBean, _without_ > any > > > annotations: > > > > > > > > > > public class TstBeanConstructor > > > > > { > > > > > > > > > > private int i1=0; > > > > > private int i2=0; > > > > > > > > > > public TstBeanConstructor(int i1) > > > > > { > > > > > this.i1 = i1*100; > > > > > } > > > > > > > > > > public int getI1() > > > > > ... > > > > > > > > > > > > > > > and the XML looks like: > > > > > > > > > > <myapp:TstBeanConstructor> > > > > > <RequestScoped/> > > > > > > <myapp:TstBeanConstructor> > > > > > > > <myapp:i1>12</myapp:i1> > > > > > > > > > > > > > > > > > > </myapp:TstBeanConstructor> > > > > > </myapp:TstBeanConstructor> > > > > > > > > > > > > > > > should this work? At first I was a bit > > confused > > > about > > > > the 2 > > > > > <myapp:TstBeanConstructor>, is > this > > correct > > > in > > > > the > > > > > XML? > > > > > > > > > > txs and LieGrue, > > > > > strub
