I ended up following the static locater pattern which is similar to 
Spring's WebApplicationContextUtils class but does not require a 
ServletContext to get at the WebApplicationContext. These changes are in 
SVN so now there is a single loaded WebApplicationContext that follows 
the web-application's life-cycle correctly. All .xml files in the 
properties/contexts/ directory are loaded into the 
WebApplicationContext. With this change reloading the uPortal context 
seems to work correctly which is another step forward.

On to the next task!

-Eric

Eric Dalquist wrote:
> Thats a good approach too, I might look into creating a utility bean to 
> do that injection that also inject a null when the context is shutting 
> down. Making sure the solution works nicely with spring context and 
> servlet context reloads which cause problems right now. I'm thinking the 
> injecting a null would work with this model to fit the reloads requirement.
>
> -Eric
>
> Drew Wills wrote:
>   
>> Eric Dalquist wrote:
>>     
>>> ...
>>>
>>> The problem is in some places that the PortalApplicationContextFacade 
>>> is used to access the BeanFactory there is no access to a 
>>> ServletContext which the WebApplicationContextUtils needs to access 
>>> the replacement WebApplicationContext.
>>> The affected areas are:
>>> CError - constructor, loads a IThrowableToElement implementation 
>>> which defines ways to render certain exceptions
>>> PersonDirectory - getPersonAttributeDao, loads the root 
>>> IPersonAttributeDao for use by other parts of the framework. This 
>>> method is called from: Authentication, PersonAttributeGroupStore, 
>>> CPersonAttributes, and PersonDirNameFinder
>>>
>>> I'm not sure what the best solution for this is. I'd like to avoid as 
>>> much custom Spring related code as possible but we may still need a 
>>> static accessor that doesn't require the ServletContext to access the 
>>> WebApplicationContext object.
>>>       
>> Eric,
>>
>> What about an approach like this (example from PersonDirectory)...
>>
>> *****
>>
>> ++ Java:
>>
>> public class PersonDirectory {
>>
>>   private static IPersonAttributeDao impl;
>>
>>   public static Object setPersonAttributeDao(IPersonAttributeDao dao) {
>>     impl = dao;
>>     return PersonDirectory.class;  // shouldn't matter what's returned
>>   }
>>
>>   ...
>>
>> }
>>
>> ++ BeansML:
>>
>> <bean id="personDirectoryService" factory-method="setPersonAttributeDao">
>>   <constructor-arg>
>>     <ref bean="personAttributeDao"/>
>>   <constructor-arg>
>> </bean>
>>
>> *****
>>
>> This should cause the bean container to inject the normal 
>> 'personAttributeDao' into the staticly-accessed PersonDirectory 
>> service to support legacy code.
>>
>> drew wills
>>
>>     

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to