Using Seam 1.1.0.GA
I have a simple Seam component which is just for injecting a singleton session factory and
a ManagedHibernateSession that uses it. (I'm aware of the HibernateSessionFactory
component but I think this problem is more general).
First the session factory wrapper component.
| @Name( "referenceSessionFactory" )
| @Scope( ScopeType.APPLICATION )
| @Intercept( InterceptionType.NEVER )
| public class ReferenceSessionFactory
| {
| @Unwrap
| public SessionFactory getSessionFactory()
| {
| return HibernateSession.getSessionFactory();
| }
| }
|
And a test component
| @Name( "test1" )
| @Scope( ScopeType.EVENT )
| public class Test1
| {
| @In( create = true )
| private Session referenceSession;
|
| @Create
| public void init()
| {
| int i = 1;
| }
|
| public String getStr()
| {
| return "test1";
| }
| }
|
and the components.xml piece.
| <!-- reference session factory wrapper component -->
| <component
class="com.azure.spark.web.seam.component.ReferenceSessionFactory"
auto-create="true"/>
|
| <!-- managed session from the reference session factory -->
| <core:managed-hibernate-session name="referenceSession"
session-factory="#{referenceSessionFactory}"/>
|
| <component class="com.azure.spark.web.bean.security.Test1"/>
|
And my simple test page
| <?xml version="1.0" encoding="UTF-8"?>
| <!DOCTYPE html
| PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
| "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
| <html
xmlns="http://www.w3.org/1999/xhtml"
|
xmlns:ui="http://java.sun.com/jsf/facelets"
|
xmlns:f="http://java.sun.com/jsf/core"
|
xmlns:h="http://java.sun.com/jsf/html">
| <head>
| <title></title>
| </head>
| <body>
| <h:outputText value="#{test1.str}"/>
| </body>
| </html>
|
Now if I request a page that references the test1 component str property I get the
following error.
| java.lang.IllegalStateException: SessionFactory not found
| at
org.jboss.seam.core.ManagedHibernateSession.getSessionFactoryFromJndiOrValueBinding(ManagedHibernateSession.java:156)
| at
org.jboss.seam.core.ManagedHibernateSession.createSession(ManagedHibernateSession.java:81)
| at
org.jboss.seam.core.ManagedHibernateSession.create(ManagedHibernateSession.java:69)
|
If I remove the @Create annotation from the test1 component then it works as expected
(page just renders "test1").
It seems that there is some problem creating and injecting the hibernate session when it
is the @Create method that is being intercepted (I can see the
Component.callCreateMethod() further down in the stack trace). I haven't seen this
problem injecting other components, facesContext and the referenceSessionFactory seem to
work fine.
More interestingly if I visit the test page it fails as above. If I visit a different
page that has a hibernate session injected and no @Create it works fine. Then if I go
back and refresh the test page the error changes to...
| java.lang.ClassCastException:
com.azure.spark.web.seam.component.ReferenceSessionFactory
| at
org.jboss.seam.core.ManagedHibernateSession.getSessionFactoryFromJndiOrValueBinding(ManagedHibernateSession.java:153)
| at
org.jboss.seam.core.ManagedHibernateSession.createSession(ManagedHibernateSession.java:81)
| at
org.jboss.seam.core.ManagedHibernateSession.create(ManagedHibernateSession.java:69)
|
Which looks like it's finding something but it returns the Seam component itself
rather than the result of the @Unwrap function. This is also when intercepting the call
to the @Create method of test1.
Appreciate any advice on whether I'm doing something wrong or if this is a possible
bug.
Cheers.
Mike.
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4009400#...
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&a...