Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-27 Thread Ben Gunter
You've specified a package name (org.stripesstuff.stripersist) in
Interceptor.Classes where it requires a class name
(org.stripesstuff.stripersist.Stripersist).

On Wed, May 26, 2010 at 11:21 PM, Nikolaos Giannopoulos 
nikol...@brightminds.org wrote:

 Ben,

 Thanks for the reply.  I tweaked the web.xml as you suggested as follows:

listener


 listener-classorg.springframework.web.context.ContextLoaderListener/listener-class!--
 Automatically loads:  /WEB-INF/applicationContext.xml --
/listener

filter
filter-nameStripesFilter/filter-name


 filter-classnet.sourceforge.stripes.controller.StripesFilter/filter-class
...
init-param
param-nameInterceptor.Classes/param-name
param-value
org.stripesstuff.stripersist,
net.sourceforge.stripes.integration.spring.SpringInterceptor
/param-value
 /init-param
init-param
param-nameExtension.Packages/param-name
param-value
org.lightagents.ui.stripes.extensions,
org.lightagents.ui.stripes.reload.extensions
/param-value
/init-param

 However I am still getting the same exception (see below this time
 though with debug logging enabled and more than just the exception).

 Could it be that the Interceptor.Classes list only guarantees the order
 of execution but not initialization.

 Any other ideas

 --Nikolaos


--

___
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users


Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-27 Thread Nikolaos Giannopoulos

Ben,

Oooops!  Corrected - however the updated web.xml still results in the 
same exception at:


...
Caused by: java.lang.NullPointerException
   at 
org.stripesstuff.stripersist.Stripersist.getEntityManagerFactory(Stripersist.java:401)
   at 
org.stripesstuff.stripersist.Stripersist.getEntityManager(Stripersist.java:495)

...

with web.xml as follows:

   listener
   
listener-classorg.springframework.web.context.ContextLoaderListener/listener-class!-- 
Automatically loads:  /WEB-INF/applicationContext.xml --

   /listener

   filter
   filter-nameStripesFilter/filter-name
   
filter-classnet.sourceforge.stripes.controller.StripesFilter/filter-class

   ...
   init-param
   param-nameInterceptor.Classes/param-name
   param-value
   org.stripesstuff.stripersist.Stripersist,
   net.sourceforge.stripes.integration.spring.SpringInterceptor
   /param-value
/init-param
   init-param
   param-nameExtension.Packages/param-name
   param-value
   org.lightagents.ui.stripes.extensions,
   org.lightagents.ui.stripes.reload.extensions,
   /param-value
   /init-param

--Nikolaos




Ben Gunter wrote:
You've specified a package name (org.stripesstuff.stripersist) in 
Interceptor.Classes where it requires a class name 
(org.stripesstuff.stripersist.Stripersist).


On Wed, May 26, 2010 at 11:21 PM, Nikolaos Giannopoulos 
nikol...@brightminds.org mailto:nikol...@brightminds.org wrote:


Ben,

Thanks for the reply.  I tweaked the web.xml as you suggested as
follows:

   listener


listener-classorg.springframework.web.context.ContextLoaderListener/listener-class!--
Automatically loads:  /WEB-INF/applicationContext.xml --
   /listener

   filter
   filter-nameStripesFilter/filter-name


filter-classnet.sourceforge.stripes.controller.StripesFilter/filter-class
   ...
   init-param
   param-nameInterceptor.Classes/param-name
   param-value
   org.stripesstuff.stripersist,
 
 net.sourceforge.stripes.integration.spring.SpringInterceptor

   /param-value
/init-param
   init-param
   param-nameExtension.Packages/param-name
   param-value
   org.lightagents.ui.stripes.extensions,
   org.lightagents.ui.stripes.reload.extensions
   /param-value
   /init-param

However I am still getting the same exception (see below this time
though with debug logging enabled and more than just the exception).

Could it be that the Interceptor.Classes list only guarantees the
order
of execution but not initialization.

Any other ideas

--Nikolaos



--

___
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users


Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-27 Thread Nikolaos Giannopoulos
Oscar,

Comments in-line...

Oscar Westra van Holthe - Kind wrote:
 I may have missed the point too, given your description. The NPE tells me
 that the class is in an invalid state.
Let's go back to the more simplified example in this thread:

public class BaseActionBean implements ActionBean {
@SpringBean  protected ModalityDao modalityDao;
...

@Repository(modalityDao)
public class ModalityDaoImpl extends BaseDaoImplModality, Integer 
implements ModalityDao {
public ListModality findAll() {
return (this.load());  // [2]
}
@PostConstruct
private void init() {
this.findAll();   // [1]
}

And let's show the ApplicationContext.xml relevant snippet:

context:annotation-config /
context:component-scan 
base-package=org.lightagents.ws.dao.impl.stripersist /

The modalityDao bean is indeed constructed and all is well except that 
the init() post construct at [1] results in the call at [2] which 
results in calls to the underlying Stripersist Interceptor were in IT is 
not initialized.

Clearly Stripersist plumbing is in an invalid state but how to get this 
to work is the question!

 Some of the reasons may be that Spring
 isn't injecting that state (at all or yet),
Not sure what you mean by this... .

 another that the interceptors are
 called in the wrong order. Due to the annotations, 
 I do not believe the latter.
   
Right.  The Stripersist interceptor intercepts at RequestInit which is 
before the Spring intereceptor which intercepts at ActionBeanResolution.

 As a result, I try to structure the code to force it to initialize the
 autowired dependencies first. Constructor injection does that, though I do
 not know if there is another way. Failing that, I'd hazard a guess that
 Spring isn't managing the instance that throws a NPE.
   
I hear you however I'm still not sure how this would help as even with 
Constructor injection you still need to have a way for the bean itself 
to fully initialize itself.  In fact, the reduced case re-presented 
above doesn't even have any additional @Autowire dependency so it is 
just this bean that needs to be created and initialized.

I am really open to what you are saying I just don't see how Constructor 
injection will solve this.

Can you please outline your solution using the snippet of code above?

Thank You

--Nikolaos

--

___
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users


Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-27 Thread Frank Pavageau
On Thu, May 27, 2010 at 5:23 PM, Nikolaos Giannopoulos
nikol...@brightminds.org wrote:
    public class BaseActionBean implements ActionBean {
       �...@springbean  protected ModalityDao modalityDao;
        ...

   �...@repository(modalityDao)
    public class ModalityDaoImpl extends BaseDaoImplModality, Integer
 implements ModalityDao {
        public ListModality findAll() {
            return (this.load());  // [2]
        }
       �...@postconstruct
        private void init() {
            this.findAll();   // [1]
        }

 And let's show the ApplicationContext.xml relevant snippet:

        context:annotation-config /
        context:component-scan
 base-package=org.lightagents.ws.dao.impl.stripersist /

 The modalityDao bean is indeed constructed and all is well except that
 the init() post construct at [1] results in the call at [2] which
 results in calls to the underlying Stripersist Interceptor were in IT is
 not initialized.

 Clearly Stripersist plumbing is in an invalid state but how to get this
 to work is the question!

The problem is that you have objects instanciated by the 2 frameworks
with independent lifecycles :
- Spring instanciates the DAO at context initialization (triggered by
the listener)
- Stripes instanciates the Stripersist interceptor at filter
initialization, and the Spring context knows nothing about it

You don't really need to use the Stripersist interceptor in your
BaseDaoImpl, you just want the EntityManagerFactory injected directly
instead. Stripersist also gets it from the Spring context anyway
(AFAIR, we use our own TypeConverter with a similar mechanism).

Frank

--

___
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users


Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-27 Thread Nikolaos Giannopoulos
Frank,

Comments in-line below...


Frank Pavageau wrote:
 On Thu, May 27, 2010 at 5:23 PM, Nikolaos Giannopoulos
 nikol...@brightminds.org wrote:
   
public class BaseActionBean implements ActionBean {
@SpringBean  protected ModalityDao modalityDao;
...

@Repository(modalityDao)
public class ModalityDaoImpl extends BaseDaoImplModality, Integer
 implements ModalityDao {
public ListModality findAll() {
return (this.load());  // [2]
}
@PostConstruct
private void init() {
this.findAll();   // [1]
}
 
snip
 The problem is that you have objects instanciated by the 2 frameworks
 with independent lifecycles :
 - Spring instanciates the DAO at context initialization (triggered by
 the listener)
 - Stripes instanciates the Stripersist interceptor at filter
 initialization, and the Spring context knows nothing about it
   
Sure.  I get that.

 You don't really need to use the Stripersist interceptor in your
 BaseDaoImpl, you just want the EntityManagerFactory injected directly
 instead. Stripersist also gets it from the Spring context anyway
 (AFAIR, we use our own TypeConverter with a similar mechanism).
   
Sorry.  Now you lost me :-)  Sounds great but what exactly are you 
suggesting?

Much appreciated!

--Nikolaos


--

___
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users


Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-27 Thread Aaron Porter
Hi Nikolaos,
What Frank is saying is you don't have to go through Stripersist to get 
an EntityManager. The main purpose of Stripersist is to provide the 
Formatter/TypeConverter for Stripes to handle entities. It also provides 
a little security by beginning a transaction so that you must explicity 
commit for changes to occur.

I don't use Spring but I'm sure there is some way to get an 
EntityManager from Spring without going through Stripersist.

Aaron

On 05/27/2010 09:35 AM, Nikolaos Giannopoulos wrote:
 Frank,

 Comments in-line below...


 Frank Pavageau wrote:

 On Thu, May 27, 2010 at 5:23 PM, Nikolaos Giannopoulos
 nikol...@brightminds.org  wrote:

  
 public class BaseActionBean implements ActionBean {
 @SpringBean  protected ModalityDao modalityDao;
 ...

 @Repository(modalityDao)
 public class ModalityDaoImpl extends BaseDaoImplModality, Integer
 implements ModalityDao {
 public ListModality  findAll() {
 return (this.load());  // [2]
 }
 @PostConstruct
 private void init() {
 this.findAll();   // [1]
 }


 snip

 The problem is that you have objects instanciated by the 2 frameworks
 with independent lifecycles :
 - Spring instanciates the DAO at context initialization (triggered by
 the listener)
 - Stripes instanciates the Stripersist interceptor at filter
 initialization, and the Spring context knows nothing about it

  
 Sure.  I get that.


 You don't really need to use the Stripersist interceptor in your
 BaseDaoImpl, you just want the EntityManagerFactory injected directly
 instead. Stripersist also gets it from the Spring context anyway
 (AFAIR, we use our own TypeConverter with a similar mechanism).

  
 Sorry.  Now you lost me :-)  Sounds great but what exactly are you
 suggesting?

 Much appreciated!

 --Nikolaos


 --

 ___
 Stripes-users mailing list
 Stripes-users@lists.sourceforge.net
 https://lists.sourceforge.net/lists/listinfo/stripes-users




--

___
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users


Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-27 Thread Nikolaos Giannopoulos

Aaron / Frank,

While I realize I don't have to use Stripersist... I am quite happy with 
it... and instead of chucking it and doing some things by hand I am 
trying to figure out how I can make things work.  I mean it is providing 
some benefit (we have MANY Entities and MANY DAOs) and while I agree 
that the EntityManagerFactory is something it indirectly leverages I 
would hope to find a way to make Stripersist work in this case... which 
I think is important.


With that said I have clearly identified the problem by running all 
sorts of tests and debugging things.


The Stripersist interceptor never gets a chance to initialize itself 
prior to the Spring interceptor no matter how I configure the web.xml 
and the ordering of Interceptor.classes appears to only apply to 
execution strictly - not in addition initialization - as some have 
suggested.


Why is this a problem... because of the way Stripersist is coded... 
Spring ends up calling my @PostConstruct which in turn calls:


   protected ListT load(String persistenceUnitName) {
   return 
Stripersist.getEntityManager(persistenceUnitName).createQuery(from  + 
this.entityClass.getName()).getResultList();


Which in turn calls:

   public static EntityManager getEntityManager(String persistenceUnit) {
   EntityManagerFactory factory = 
getEntityManagerFactory(persistenceUnit);


Which in turn calls:

   public static EntityManagerFactory getEntityManagerFactory(String 
persistenceUnit) {

   return entityManagerFactories.get(persistenceUnit);  // [1]

and herein lies the problem... if Stripersist init() has not been called 
then the following static attribute is NULL


   static private MapString, EntityManagerFactory entityManagerFactories;

It is the lack of initialization of this attribute using information 
obtained by reading the persistence.xml, calling the Persistence class, 
etc... that is the problem.


And to prove that... if we do the following in our @PostConstruct:
   Stripersist s = new Stripersist();
   s.init(StripesFilter.getConfiguration());

   ListModality modalityList = this.modalityDao.findAll();
   this.modalityCache = new ModalityCache();
   this.modalityCache.init(modalityList);

Stripersist spits up 2 exceptions about being accessed outside any 
request but now that the static attributes are initialized things work 
from here.  Of course defensively placing this code that spews 2 
exceptions in each service bean is not acceptable but it proves the point.


Stripersist interceptor needs to be initialized BEFORE Spring 
interceptor and Stripes does NOT seem to offer a configurable way to 
force this.


Does anyone know how I can create a wrapper to dynamically:

-- Init and wire up Stripersist interceptor...
followed by
-- Init and wire up Spring interceptor

I figure if I create a simple wrapper to force the ordering we should be 
in business.


--Nikolaos




Aaron Porter wrote:

Hi Nikolaos,
What Frank is saying is you don't have to go through Stripersist to get 
an EntityManager. The main purpose of Stripersist is to provide the 
Formatter/TypeConverter for Stripes to handle entities. It also provides 
a little security by beginning a transaction so that you must explicity 
commit for changes to occur.


I don't use Spring but I'm sure there is some way to get an 
EntityManager from Spring without going through Stripersist.


Aaron

On 05/27/2010 09:35 AM, Nikolaos Giannopoulos wrote:
  

Frank,

Comments in-line below...


Frank Pavageau wrote:
   


On Thu, May 27, 2010 at 5:23 PM, Nikolaos Giannopoulos
nikol...@brightminds.org  wrote:

 
  

public class BaseActionBean implements ActionBean {
@SpringBean  protected ModalityDao modalityDao;
...

@Repository(modalityDao)
public class ModalityDaoImpl extends BaseDaoImplModality, Integer
implements ModalityDao {
public ListModality  findAll() {
return (this.load());  // [2]
}
@PostConstruct
private void init() {
this.findAll();   // [1]
}

   


snip
   


The problem is that you have objects instanciated by the 2 frameworks
with independent lifecycles :
- Spring instanciates the DAO at context initialization (triggered by
the listener)
- Stripes instanciates the Stripersist interceptor at filter
initialization, and the Spring context knows nothing about it

 
  

Sure.  I get that.

   


You don't really need to use the Stripersist interceptor in your
BaseDaoImpl, you just want the EntityManagerFactory injected directly
instead. Stripersist also gets it from the Spring context anyway
(AFAIR, we use our own TypeConverter with a similar mechanism).

 
  

Sorry.  Now you lost me :-)  Sounds great but what exactly are you
suggesting?

Much appreciated!

--Nikolaos


--

___

Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-27 Thread Nikolaos Giannopoulos

Ben,

Actually I was thinking about what I wrote below and think maybe the 
PROPER solution is to have Stripes FIXED to enforce the ordering of 
classes in Interceptor.Classes w.r.t. initialization (in addition to 
the ordering already enforced for execution).


Would this be difficult to fix considering the ordering is already 
handled for execution


I have a test bed ready to go :-) AND clearly this would be the right 
solution and I think an important more general fix for Stripes for other 
future scenarios as Developers leverage interceptors more and more this 
will become a necessity vs. a nice to have I suspect.


Thanks,

--Nikolaos

P.S.  If you can point me to the code that does the initialization I can 
take a look to see what I can provide




Nikolaos Giannopoulos wrote:

Aaron / Frank,

While I realize I don't have to use Stripersist... I am quite happy 
with it... and instead of chucking it and doing some things by hand I 
am trying to figure out how I can make things work.  I mean it is 
providing some benefit (we have MANY Entities and MANY DAOs) and while 
I agree that the EntityManagerFactory is something it indirectly 
leverages I would hope to find a way to make Stripersist work in this 
case... which I think is important.


With that said I have clearly identified the problem by running all 
sorts of tests and debugging things.


The Stripersist interceptor never gets a chance to initialize itself 
prior to the Spring interceptor no matter how I configure the web.xml 
and the ordering of Interceptor.classes appears to only apply to 
execution strictly - not in addition initialization - as some have 
suggested.


Why is this a problem... because of the way Stripersist is coded... 
Spring ends up calling my @PostConstruct which in turn calls:


protected ListT load(String persistenceUnitName) {
return 
Stripersist.getEntityManager(persistenceUnitName).createQuery(from  
+ this.entityClass.getName()).getResultList();


Which in turn calls:

public static EntityManager getEntityManager(String persistenceUnit) {
EntityManagerFactory factory = 
getEntityManagerFactory(persistenceUnit);


Which in turn calls:

public static EntityManagerFactory getEntityManagerFactory(String 
persistenceUnit) {

return entityManagerFactories.get(persistenceUnit);  // [1]

and herein lies the problem... if Stripersist init() has not been 
called then the following static attribute is NULL


static private MapString, EntityManagerFactory 
entityManagerFactories;


It is the lack of initialization of this attribute using information 
obtained by reading the persistence.xml, calling the Persistence 
class, etc... that is the problem.


And to prove that... if we do the following in our @PostConstruct:
Stripersist s = new Stripersist();
s.init(StripesFilter.getConfiguration());

ListModality modalityList = this.modalityDao.findAll();
this.modalityCache = new ModalityCache();
this.modalityCache.init(modalityList);

Stripersist spits up 2 exceptions about being accessed outside any 
request but now that the static attributes are initialized things work 
from here.  Of course defensively placing this code that spews 2 
exceptions in each service bean is not acceptable but it proves the point.


Stripersist interceptor needs to be initialized BEFORE Spring 
interceptor and Stripes does NOT seem to offer a configurable way to 
force this.


Does anyone know how I can create a wrapper to dynamically:

-- Init and wire up Stripersist interceptor...
followed by
-- Init and wire up Spring interceptor

I figure if I create a simple wrapper to force the ordering we should 
be in business.


--Nikolaos




Aaron Porter wrote:

Hi Nikolaos,
What Frank is saying is you don't have to go through Stripersist to get 
an EntityManager. The main purpose of Stripersist is to provide the 
Formatter/TypeConverter for Stripes to handle entities. It also provides 
a little security by beginning a transaction so that you must explicity 
commit for changes to occur.


I don't use Spring but I'm sure there is some way to get an 
EntityManager from Spring without going through Stripersist.


Aaron

On 05/27/2010 09:35 AM, Nikolaos Giannopoulos wrote:
  

Frank,

Comments in-line below...


Frank Pavageau wrote:
   


On Thu, May 27, 2010 at 5:23 PM, Nikolaos Giannopoulos
nikol...@brightminds.org  wrote:

 
  

public class BaseActionBean implements ActionBean {
@SpringBean  protected ModalityDao modalityDao;
...

@Repository(modalityDao)
public class ModalityDaoImpl extends BaseDaoImplModality, Integer
implements ModalityDao {
public ListModality  findAll() {
return (this.load());  // [2]
}
@PostConstruct
private void init() {
this.findAll();   // [1]
}

   


snip
   


The problem is that you have objects instanciated by the 2 

Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-27 Thread Frank Pavageau
Nikolaos,

On Thu, May 27, 2010 at 6:35 PM, Nikolaos Giannopoulos
nikol...@brightminds.org wrote:
 Frank Pavageau wrote:
 On Thu, May 27, 2010 at 5:23 PM, Nikolaos Giannopoulos
 nikol...@brightminds.org wrote:

    public class BaseActionBean implements ActionBean {
       �...@springbean  protected ModalityDao modalityDao;
        ...

   �...@repository(modalityDao)
    public class ModalityDaoImpl extends BaseDaoImplModality, Integer
 implements ModalityDao {
        public ListModality findAll() {
            return (this.load());  // [2]
        }
       �...@postconstruct
        private void init() {
            this.findAll();   // [1]
        }

 snip
 The problem is that you have objects instanciated by the 2 frameworks
 with independent lifecycles :
 - Spring instanciates the DAO at context initialization (triggered by
 the listener)
 - Stripes instanciates the Stripersist interceptor at filter
 initialization, and the Spring context knows nothing about it

 Sure.  I get that.

 You don't really need to use the Stripersist interceptor in your
 BaseDaoImpl, you just want the EntityManagerFactory injected directly
 instead. Stripersist also gets it from the Spring context anyway
 (AFAIR, we use our own TypeConverter with a similar mechanism).

 Sorry.  Now you lost me :-)  Sounds great but what exactly are you
 suggesting?

Actually, I remembered something false: Stripersist does not use
Spring, as Aaron pointed out. If it had, you would have declared an
EntityManagerFactoryBean in your Spring context, and you could have
injected the resulting EntityManagerFactory in the DAO. However, after
reading on Sourceforge's svn the code in Stripersist, I see that
Stripersist creates its own EntityManagerFactories by parsing
persistence.xml, and it would be a bit of a shame to create another
set of factories with Spring; especially when your domain gets large,
a single factory takes some time to start, so doubling the startup
time wouldn't be ideal.

In light of that, a solution might be to add another filter to your
web.xml, instanciated after Stripes' filter (and thus after
Stripersist's initialization), which would call your service's init()
method. You can even use a DelegatingFilter from Spring, so it has the
service injected. If you have multiple services to initialize, they
can all implement an interface to mark the need for initialization so
you get all the implementing services injected together.

Or you can replace the listener used to bootstrap Spring by a custom
filter instanciating the context, also running after Stripes' filter.

However, regarding your other mail, I don't see how ordering the
initialization of the interceptors would solve anything, since
SpringInterceptor has nothing to do with Spring's initialization.

Frank

--

___
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users


Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-27 Thread Nikolaos Giannopoulos

Frank Pavageau wrote:

Nikolaos,

On Thu, May 27, 2010 at 6:35 PM, Nikolaos Giannopoulos
nikol...@brightminds.org wrote:
  

Sorry.  Now you lost me :-)  Sounds great but what exactly are you
suggesting?



Actually, I remembered something false: Stripersist does not use
Spring, as Aaron pointed out. If it had, you would have declared an
EntityManagerFactoryBean in your Spring context, and you could have
injected the resulting EntityManagerFactory in the DAO.

Right.  My Spring configuration is super minimal and sweet :-)

That is another reason I like Stripersist - it actually works remarkably 
well.



However, after
reading on Sourceforge's svn the code in Stripersist, I see that
Stripersist creates its own EntityManagerFactories by parsing
persistence.xml, and it would be a bit of a shame to create another
set of factories with Spring; especially when your domain gets large,
a single factory takes some time to start, so doubling the startup
time wouldn't be ideal.
  
Precisely.  It doesn't make sense.  Either you use Stripersist or you 
don't... and I choose to... :-)



In light of that, a solution might be to add another filter to your
web.xml, instanciated after Stripes' filter (and thus after
Stripersist's initialization), which would call your service's init()
method. You can even use a DelegatingFilter from Spring, so it has the
service injected. If you have multiple services to initialize, they
can all implement an interface to mark the need for initialization so
you get all the implementing services injected together.
  
Sounds like an interesting idea.  I guess that could work but then the 
Filter would do nothing on each request?  And I would need to build some 
sort of service registration / initialization.  It should work but seems 
a bit kludgy



Or you can replace the listener used to bootstrap Spring by a custom
filter instanciating the context, also running after Stripes' filter.
  
This is the approach I am considering.  If I did this then the 
@PostConstruct would work fine and the service bean's would be fully 
initialized once they become available... just feels more like OO in 
that the init is internal and encapsulated...

However, regarding your other mail, I don't see how ordering the
initialization of the interceptors would solve anything, since
SpringInterceptor has nothing to do with Spring's initialization.
  
You are correct.  Ordering the Interceptors would not work as Spring 
doesn't initialize itself there anyways.


Thanks for the solution / options / thoughts...

--Nikolaos

--

___
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users


Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-26 Thread Nikolaos Giannopoulos

Freddy (and Aaron),

Offhand THANK YOU for the help!  While it DID help  I'm afraid I'm not 
there yet... .


So I added the @PostConstruct annotation (and   
context:annotation-config /   in the applicationContext.xml to 
register things) and have the following code:


@Service(modalityService)
public class ModalityServiceImpl implements ModalityService {

   @Autowired
   private ModalityDao modalityDao;

   private ModalityCache modalityCache;

   public ModalityServiceImpl() {
   }

   @PostConstruct
   public void initService() {
   ListModality modalityList = this.modalityDao.findAll();
   this.modalityCache = new ModalityCache();
   this.modalityCache.init(modalityList);
   }

And the @PostConstruct indeed helped as the initService method is 
getting executed however now I am back to the issue with Stripersist 
generating a NPE in the following method call:


   /**
* Finds the EntityManagerFactory which is associated with the specified
* persistence unit. Normally you shouldn't use this class because
* Stripersist won't clean up any EntityManagers that you create.
*
* @param persistenceUnit the name of the persistence unit
* @return an EntityManagerFactory or null
*/
   public static EntityManagerFactory getEntityManagerFactory(String 
persistenceUnit)

   {
   return entityManagerFactories.get(persistenceUnit);
   }

Where:  entityManagerFactories is NULL!  So it is almost like even 
though the @PostConstruct annotated method gets invoked on bean post 
creation a layer of the onion has been lifted and now the problem 
appears that Stripersist hasn't completed its initialization.  I have to 
think there MUST be a way to solve this!!!   AHh???


Full stack trace below

Many Thanks,

--Nikolaos


[#|2010-05-26T14:07:50.795-0400|INFO|glassfishv3.0|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=11;_ThreadName=FelixStartLevel;|[14:07:50,774] 
ERROR 
org.springframework.web.context.ContextLoader.initWebApplicationContext  
- Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'modalityService': Invocation of init method failed; 
nested exception is java.lang.NullPointerException
   at 
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:147)
   at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:350)
   at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1331)
   at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
   at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)

   at java.security.AccessController.doPrivileged(Native Method)
   at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
   at 
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
   at 
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
   at 
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
   at 
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
   at 
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
   at 
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
   at 
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
   at 
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
   at 
org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
   at 
org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
   at 
org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
   at 
org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:4591)
   at 
com.sun.enterprise.web.WebModule.contextListenerStart(WebModule.java:535)
   at 
org.apache.catalina.core.StandardContext.start(StandardContext.java:5193)

   at com.sun.enterprise.web.WebModule.start(WebModule.java:499)
   at 
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:928)
   at 

Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-26 Thread Nikolaos Giannopoulos
Still trying to resolve this issue... and I think I have made some 
progress in ZERO'ing in on a reduced version of the issue.


The following code works fine:

   public class BaseActionBean implements ActionBean {
   @SpringBean  protected ModalityDao modalityDao;
   ...

   @Repository(modalityDao)
   public class ModalityDaoImpl extends BaseDaoImplModality, Integer 
implements ModalityDao {

   public ListModality findAll() {
   return (this.load());
   }

However if I add a @PostConstruct on the above DAO as follows I get the 
exception reported previously (see below again):


   public class BaseActionBean implements ActionBean {
   @SpringBean  protected ModalityDao modalityDao;
   ...

   @Repository(modalityDao)
   public class ModalityDaoImpl extends BaseDaoImplModality, Integer 
implements ModalityDao {

   public ListModality findAll() {
   return (this.load());
   }
   @PostConstruct
   private void init() {
   this.findAll();
   }

It would appear that Spring's interceptor is doing its work BEFORE 
Stripersist's interceptor gets its chance to initialize.


Because in digging through the Stripersist code we have:

   /**
* Called by Stripes during initialization.
*/
   public void init(Configuration configuration)
   ...
   URL url = 
Thread.currentThread().getContextClassLoader().getResource(/META-INF/persistence.xml);

   ...
   init(url);

... and in turn init(url) calls ...
 
   public void init(URL xml)

   ...
   entityManagerFactories = new ConcurrentHashMapString, 
EntityManagerFactory();


and that would clearly appear that entityManagerFactories is initialized 
however it is NULL when we run the 2nd code above.


It would APPEAR we want the Stripersist interceptor to initialize BEFORE 
the Spring interceptor.


Anyone know how we can accomplish this besides creating a Spring-Stripes 
extension class that simply calls them in the desired order???
  
--Nikolaos





Nikolaos Giannopoulos wrote:

Freddy (and Aaron),

Offhand THANK YOU for the help!  While it DID help  I'm afraid I'm not 
there yet... .


So I added the @PostConstruct annotation (and   
context:annotation-config /   in the applicationContext.xml to 
register things) and have the following code:


@Service(modalityService)
public class ModalityServiceImpl implements ModalityService {

@Autowired
private ModalityDao modalityDao;

private ModalityCache modalityCache;

public ModalityServiceImpl() {
}

@PostConstruct
public void initService() {
ListModality modalityList = this.modalityDao.findAll();
this.modalityCache = new ModalityCache();
this.modalityCache.init(modalityList);
}

And the @PostConstruct indeed helped as the initService method is 
getting executed however now I am back to the issue with Stripersist 
generating a NPE in the following method call:


/**
 * Finds the EntityManagerFactory which is associated with the 
specified

 * persistence unit. Normally you shouldn't use this class because
 * Stripersist won't clean up any EntityManagers that you create.
 *
 * @param persistenceUnit the name of the persistence unit
 * @return an EntityManagerFactory or null
 */
public static EntityManagerFactory getEntityManagerFactory(String 
persistenceUnit)

{
return entityManagerFactories.get(persistenceUnit);
}

Where:  entityManagerFactories is NULL!  So it is almost like even 
though the @PostConstruct annotated method gets invoked on bean post 
creation a layer of the onion has been lifted and now the problem 
appears that Stripersist hasn't completed its initialization.  I have 
to think there MUST be a way to solve this!!!   AHh???


Full stack trace below

Many Thanks,

--Nikolaos


[#|2010-05-26T14:07:50.795-0400|INFO|glassfishv3.0|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=11;_ThreadName=FelixStartLevel;|[14:07:50,774] 
ERROR 
org.springframework.web.context.ContextLoader.initWebApplicationContext  
- Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error 
creating bean with name 'modalityService': Invocation of init method 
failed; nested exception is java.lang.NullPointerException
at 
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:147)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:350)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1331)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
at 

Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-26 Thread Oscar Westra van Holthe - Kind
On 26-05-2010 at 03:16, Nikolaos Giannopoulos wrote:
 So we have the following code excerpt:
 
 @Service
 public class ModalityServiceImpl implements ModalityService {
 
 @Autowired
 private ModalityDao modalityDaoImpl;
 
 public ModalityServiceImpl() {
 this.initService();
 }
 
 private void initAfter() {
 ListModality modalityList = this.modalityDaoImpl.findAll();
 // ** NPE ** - this.modalityDaoImpl ** IS NULL **
 this.modalityCache = new ModalityCache();
 this.modalityCache.init(modalityList);
 }
 
 However, the above results in a NullPointerException at the line marked 
 with ** NPE ** because this.modalityDaoImpl is NULL which clearly 
 indicates that Spring has not completed the Autowiring and we are trying 
 to invoke a method on.

I may be going against dogma here, but I prefer all classes to be in a valid
state all the time. So no Spring injection into fields: after construction
the object is in an invalid state until Spring completes the injection.

Instead, I let Spring do Constructor injection.

CON: I need to set the field myself (but I can make it final)
PRO: The constructor can do the initialization


Oscar

-- 
   ,-_
  /() ) Oscar Westra van Holthe - Kind  http://www.xs4all.nl/~kindop/
 (__ (
=/  ()  QED - Quite Easily Done


signature.asc
Description: Digital signature
--

___
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users


Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-26 Thread Ben Gunter
If you list both of these interceptors in your Interceptor.Classes
init-param in the order you want them to initialize they will initialize in
the specified order. You already list SpringInterceptor there. I think if
you just insert Stripersist before it then you'll be in business. (Once you
do that then you should remove their packages from Extension.Packages to
improve startup speed.)

-Ben

On Wed, May 26, 2010 at 10:25 PM, Nikolaos Giannopoulos 
nikol...@brightminds.org wrote:

  All,

 After a lot of digging I have unfortunately gotten nowhere.

 I have found that the lifecycles that Stripersist intercepts are:
 @Intercepts({LifecycleStage.RequestInit, LifecycleStage.RequestComplete})

 Whereas the Spring Interceptor intercepts at:
 @Intercepts(LifecycleStage.ActionBeanResolution)

 SO if both were initialized at execution intercept time then I suspect we
 would not have any issues.

 However the NPE tells me that this issue appears due to order of
 initialization of Interceptors.
 I have found how to order the execution of Interceptors BUT not the
 initialization of Interceptors.

 Does anyone know how I can get Stripersist to initialize BEFORE Spring
 Interceptor?
 I have the following web.xml snippet and could really use a lot of help...
 PLEASE...

 listener

 listener-classorg.springframework.web.context.ContextLoaderListener/listener-class!--
 Automatically loads:  /WEB-INF/applicationContext.xml --
 /listener

 filter
 filter-nameStripesFilter/filter-name

 filter-classnet.sourceforge.stripes.controller.StripesFilter/filter-class
 ...
 init-param
 param-nameInterceptor.Classes/param-name

 param-valuenet.sourceforge.stripes.integration.spring.SpringInterceptor/param-value
  /init-param
 init-param
 param-nameExtension.Packages/param-name
 param-value
 org.lightagents.ui.stripes.extensions,
 org.lightagents.ui.stripes.reload.extensions,
 org.stripesstuff.stripersist,
 net.sourceforge.stripes.integration.spring
 /param-value
 /init-param
 ...

 Stripersist is an awesome package and we have even built a shard layer on
 top of it... I surely hope there is a solution for it to play nice with
 Spring in this case.

 Thanks in Advance!

 --Nikolaos



 Nikolaos Giannopoulos wrote:

 Still trying to resolve this issue... and I think I have made some progress
 in ZERO'ing in on a reduced version of the issue.

 The following code works fine:

 public class BaseActionBean implements ActionBean {
 @SpringBean  protected ModalityDao modalityDao;
 ...

 @Repository(modalityDao)
 public class ModalityDaoImpl extends BaseDaoImplModality, Integer
 implements ModalityDao {
 public ListModality findAll() {
 return (this.load());
 }

 However if I add a @PostConstruct on the above DAO as follows I get the
 exception reported previously (see below again):

 public class BaseActionBean implements ActionBean {
 @SpringBean  protected ModalityDao modalityDao;
 ...

 @Repository(modalityDao)
 public class ModalityDaoImpl extends BaseDaoImplModality, Integer
 implements ModalityDao {
 public ListModality findAll() {
 return (this.load());
 }
 @PostConstruct
 private void init() {
 this.findAll();
 }

 It would appear that Spring's interceptor is doing its work BEFORE
 Stripersist's interceptor gets its chance to initialize.

 Because in digging through the Stripersist code we have:

 /**
  * Called by Stripes during initialization.
  */
 public void init(Configuration configuration)
 ...
 URL url =
 Thread.currentThread().getContextClassLoader().getResource(/META-INF/persistence.xml);
 ...
 init(url);

 ... and in turn init(url) calls ...

 public void init(URL xml)
 ...
 entityManagerFactories = new ConcurrentHashMapString,
 EntityManagerFactory();

 and that would clearly appear that entityManagerFactories is initialized
 however it is NULL when we run the 2nd code above.

 It would APPEAR we want the Stripersist interceptor to initialize BEFORE
 the Spring interceptor.

 Anyone know how we can accomplish this besides creating a Spring-Stripes
 extension class that simply calls them in the desired order???

 --Nikolaos




 Nikolaos Giannopoulos wrote:

 Freddy (and Aaron),

 Offhand THANK YOU for the help!  While it DID help  I'm afraid I'm not
 there yet... .

 So I added the @PostConstruct annotation (and   context:annotation-config
 /   in the applicationContext.xml to register things) and have the
 following code:

 @Service(modalityService)
 public class ModalityServiceImpl implements ModalityService {

 @Autowired
 private ModalityDao modalityDao;

 private ModalityCache modalityCache;

 public 

Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-26 Thread Nikolaos Giannopoulos
Ben,

Thanks for the reply.  I tweaked the web.xml as you suggested as follows:

listener

listener-classorg.springframework.web.context.ContextLoaderListener/listener-class!--
 
Automatically loads:  /WEB-INF/applicationContext.xml --
/listener
 
filter
filter-nameStripesFilter/filter-name

filter-classnet.sourceforge.stripes.controller.StripesFilter/filter-class
...
init-param
param-nameInterceptor.Classes/param-name
param-value
org.stripesstuff.stripersist,
net.sourceforge.stripes.integration.spring.SpringInterceptor
/param-value
 /init-param
init-param
param-nameExtension.Packages/param-name
param-value
org.lightagents.ui.stripes.extensions,
org.lightagents.ui.stripes.reload.extensions
/param-value
/init-param

However I am still getting the same exception (see below this time 
though with debug logging enabled and more than just the exception).

Could it be that the Interceptor.Classes list only guarantees the order 
of execution but not initialization.

Any other ideas

--Nikolaos



[#|2010-05-26T23:01:13.755-0400|INFO|glassfishv3.0|javax.enterprise.system.core.security.com.sun.enterprise.security|_ThreadID=23;_ThreadName=AutoDeployer;|Security
 
startup service called|#]

[#|2010-05-26T23:01:13.760-0400|INFO|glassfishv3.0|javax.enterprise.system.core.security.com.sun.enterprise.security|_ThreadID=23;_ThreadName=AutoDeployer;|SEC1143:
 
Loading policy provider 
com.sun.enterprise.security.provider.PolicyWrapper.|#]

[#|2010-05-26T23:01:13.804-0400|INFO|glassfishv3.0|javax.enterprise.system.core.security.com.sun.enterprise.security.auth.realm|_ThreadID=23;_ThreadName=AutoDeployer;|Realm
 
admin-realm of classtype 
com.sun.enterprise.security.auth.realm.file.FileRealm successfully 
created.|#]

[#|2010-05-26T23:01:13.805-0400|INFO|glassfishv3.0|javax.enterprise.system.core.security.com.sun.enterprise.security.auth.realm|_ThreadID=23;_ThreadName=AutoDeployer;|Realm
 
file of classtype com.sun.enterprise.security.auth.realm.file.FileRealm 
successfully created.|#]

[#|2010-05-26T23:01:13.807-0400|INFO|glassfishv3.0|javax.enterprise.system.core.security.com.sun.enterprise.security.auth.realm|_ThreadID=23;_ThreadName=AutoDeployer;|Realm
 
certificate of classtype 
com.sun.enterprise.security.auth.realm.certificate.CertificateRealm 
successfully created.|#]

[#|2010-05-26T23:01:13.813-0400|INFO|glassfishv3.0|javax.enterprise.system.core.security.com.sun.enterprise.security|_ThreadID=23;_ThreadName=AutoDeployer;|Security
 
service(s) started successfully|#]

[#|2010-05-26T23:01:14.046-0400|INFO|glassfishv3.0|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=23;_ThreadName=AutoDeployer;|Created
 
HTTP listener http-listener-1 on port 8080|#]

[#|2010-05-26T23:01:14.053-0400|INFO|glassfishv3.0|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=23;_ThreadName=AutoDeployer;|Created
 
HTTP listener http-listener-2 on port 8181|#]

[#|2010-05-26T23:01:14.061-0400|INFO|glassfishv3.0|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=23;_ThreadName=AutoDeployer;|Created
 
HTTP listener admin-listener on port 4848|#]

[#|2010-05-26T23:01:14.063-0400|INFO|glassfishv3.0|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=22;_ThreadName={felix.fileinstall.poll=5000,
 
felix.fileinstall.bundles.new.start=true, 
felix.fileinstall.dir=/Users/nikolaos2/home/dv/oracle-glassfish-3.0/glassfish/modules/autostart/,
 
felix.fileinstall.debug=1};|Updating configuration from 
org.apache.felix.fileinstall-autodeploy-bundles.cfg|#]

[#|2010-05-26T23:01:14.067-0400|INFO|glassfishv3.0|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=22;_ThreadName={felix.fileinstall.poll=5000,
 
felix.fileinstall.bundles.new.start=true, 
felix.fileinstall.dir=/Users/nikolaos2/home/dv/oracle-glassfish-3.0/glassfish/modules/autostart/,
 
felix.fileinstall.debug=1};|Installed 
/Users/nikolaos2/home/dv/oracle-glassfish-3.0/glassfish/modules/autostart/org.apache.felix.fileinstall-autodeploy-bundles.cfg|#]

[#|2010-05-26T23:01:14.071-0400|INFO|glassfishv3.0|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=24;_ThreadName={felix.fileinstall.poll=5000,
 
felix.fileinstall.bundles.new.start=true, 
service.pid=org.apache.felix.fileinstall.42b62929-8446-4358-9e67-0a53b6423f82, 
felix.fileinstall.dir=/Users/nikolaos2/home/dv/oracle-glassfish-3.0/glassfish/domains/domain1/autodeploy/bundles/,
 
felix.fileinstall.filename=org.apache.felix.fileinstall-autodeploy-bundles.cfg, 
service.factorypid=org.apache.felix.fileinstall, 
felix.fileinstall.debug=1};|{felix.fileinstall.poll (ms) = 5000, 
felix.fileinstall.dir = 
/Users/nikolaos2/home/dv/oracle-glassfish-3.0/glassfish/domains/domain1/autodeploy/bundles,
 

Re: [Stripes-users] Stripes and Spring - Exception if doing INIT in Constructor

2010-05-26 Thread Oscar Westra van Holthe - Kind
On 26-05-2010 at 19:53, Nikolaos Giannopoulos wrote:
 Oscar,
 
[...]
 The problem here appears to be that Spring beans get initialized
 BEFORE Stripersist initializes itself... or at least that is how it
 appears... and as such invocations to Stripersist after bean
 creation / DI will throw errors regardless of whether I am doing
 Constructor vs. Setter based injection... unless I am missing
 something?
 
 If I did miss your point what do you propose as a solution?

I may have missed the point too, given your description. The NPE tells me
that the class is in an invalid state. Some of the reasons may be that Spring
isn't injecting that state (at all or yet), another that the interceptors are
called in the wrong order. Due to the annotations, I do not believe the
latter.

As a result, I try to structure the code to force it to initialize the
autowired dependencies first. Constructor injection does that, though I do
not know if there is another way. Failing that, I'd hazard a guess that
Spring isn't managing the instance that throws a NPE.


Oscar

-- 
   ,-_
  /() ) Oscar Westra van Holthe - Kind  http://www.xs4all.nl/~kindop/
 (__ (
=/  ()  Even if you win the rat race, you are still a rat...


signature.asc
Description: Digital signature
--

___
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users