Thanks Robert for your inputs.
Well I'm sure that Struts does initialize all null objects along the object
chain if they are null, because for 90% of the time, this works. I do not
explicitly initialize objects along the object chain in my code. For most of
the time, Struts detects that it is null and therefore initializes it for me
till the final property which it sets properly.

As mentioned this problem occurs intermittently and its so frustrating for
apps that are in production because of its unpredictability. I will follow
your advice to initialize all objects in the object chain and see if it
helps.

Thanks for your help!

Regards.
W.SayJon

Email Disclaimer:
The information contained in or attached to this email is confidential and
solely for the use of the individual or entity to whom it is addressed.
If you are not the intended recipient, please notify the sender immediately
and delete any copies of this email.
Any unauthorised disclosure, copying, distribution or any action taken in
reliance on the contents of this information is strictly prohibited and may
be unlawful.


On Thu, Jul 16, 2009 at 3:47 PM, Robert Graf-Waczenski <r...@lsoft.com>wrote:

> Say Jon schrieb:
>
>> public void prepare() throws Exception {
>>  super.prepare();
>>  BaseEntity model = null;
>>  if (getId() != null) {
>>  model = (BaseEntity) session.get(getEmbeddedModelKey() + getId());
>>  if (model == null) model = service.retrieve(modelClass, getId());
>>  }
>>  if (model == null && !(this instanceof EmbeddedDrivenAction)) model =
>> getNewModel();
>>
>> setModel(model);
>>  }
>>
>>
>
> This code does not look particularly wrong. It does what we also do
> frequently (without the service.retrieve() part and without the user using
> several sessions for his work). So i guess that your problem is not located
> here.
>
>
>  I have another class EmbeddedDrivenAction which subclasses
>> ModelDrivenAction:
>>
>> public void prepare() throws Exception {
>>  //call modeldriven's prepare to load in the model
>>  super.prepare();
>>
>> if (embeddedModelClass != null)
>>
>> setEmbeddedModel((IEmbeddable)Class.forName(embeddedModelClass).newInstance());
>>  Object suffixObj = (getId()!= null?getId():getParentId());
>>  String suffix = "";
>>  if (suffixObj != null) suffix = suffixObj.toString();
>>  String sessionKey = getEmbeddedModelKey() + suffix;
>>  //for main action, will use id
>>  if (session.get(sessionKey) == null) { // for main action
>>  if (getModel() == null) setModel(getNewModel());
>>  if (!WebUtility.getInstance().isReloadPagePreservingValues(session))
>> removeSessionObjects();
>>  session.put(sessionKey, getModel());
>>  }
>>  //for embedded action, will use parentid
>>  else {
>>  setModel((BaseEntity) session.get(sessionKey));
>>  }
>>  }
>>
>> This is how my model is initialized. It will first check if the model have
>> been put into the session (I'm using an architecture whereby the user is
>> using 2 or more screens for the same model object). If eventually the
>> model
>> is not found, the getNewModel() object will return a newly instantiated
>> model. In any case, a instantiated model will definitely be returned.
>>
>>
>
> I didn't check (and in fact, not completely understand) your code above,
> but i think you should investigate a bit further into the area below:
>
>> According to my first email, my call chain is "userAddress.country.id".
>> If I
>> don't remember wrongly, if my userAddress is null, Struts will initialize
>> it
>> for me. If my country is null, Struts will also initialize it for me.
>> After
>> both are initialized, the ID is set. In all cases, Struts will initialize
>> the objects in the chain and apply the final value. Pls correct me if I'm
>> wrong here.
>>
>>
>
> I can't tell you off the top of my head, but i'd suggest to verify your
> assumption with the debugger. If your assumption is correct, theny you
> should see calls to getUserAddress(), getCountry() and getId(). We here in
> our application frequently use nested instances and we always make sure that
> anything that is necessary for such a call chain is initialized properly by
> our own code. My strong guess is that Struts does not initalize the objects
> for you. (And, btw, even if it did: How would your container class obtain
> the correct reference to the object created for you by Struts?) And how
> would the ultimate setter be then called on an instance that is referenced
> from the object at the start of your call chain? Try to use lazy
> initialization and reference bookkeeping when your getter method is accessed
> and you find your local member variable pointer null.
>
>> For point 3, what do you mean by "not ok"? Pls elaborate on that if
>> possible.
>>
>>
>
> By "not ok" i meant that your parent object does not have all its child
> objects correctly initialized so that when Struts calls along your object
> nesting chain, it encounters null return values and either has to deal with
> NPEs or (if your guess that it initializes objects on the fly which i'm
> still a bit unsure about) it creates new instances that only live in the
> nether outside of your original object. So if you later need to query the
> value of an object further down the call chain, all parent objects need
> correct references to the child objects. I'm not aware of any mechanism in
> Struts to establish such a proper reference chain for you, so you need to
> make sure that is exists before Struts comes into play.
>
> The behavior you describe hints that your reference chain somehow gets
> broken during the lifetime of your model object so that your call chains
> don't work correctly anymore.
>
> Robert
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
> For additional commands, e-mail: user-h...@struts.apache.org
>
>

Reply via email to