Extending UserPortlet in separate web app transaction proble
jon_french May 1, 2006 5:37 PMI had a need to extend the default behavior of org.jboss.portal.core.portlet.user.UserPortlet. I needed to change both the behavior of the doView method and the associated JSP content. To that end, I did this:
[1] Created a class [MyUserPortlet] that extended UserPortlet and overrode doView like this:
protected void doView(JBossRenderRequest req, JBossRenderResponse resp) throws PortletException, PortletSecurityException, IOException { /* my custom code */ super.doView(req,resp); }
[2] Created a web app named "mywebapp.war"
[3] Deployed MyUserPortlet in "mywebapp.war" such that MyUserPortlet existed in mywebapp.war/WEB-INF/classes directory, mywebapp.war/WEB-INF/portlet.xml contained a entry for MyUserPortlet, and all the MyUserPortlet jsp were copied to mywebapp.war/WEB-INF/jsp/user.
[4] Created an instance of MyUserPortlet in mywebapp.war/WEB-INF/my-object.xml.
[5] Created multiple pages in JBoss portal where an instance of MyUserPortlet was displayed.
For most UserPortlet functionality, everything works just like I would expect if I was interacting with the default UserPortlet instance as configured in $JBOSS_PORTAL_HOME/conf/data/default-object.xml. However, when, I try to access UserPortal functionality that requires database access (like showing the list of users), I get this exception:
org.hibernate.HibernateException: Unable to locate current JTA transaction at org.hibernate.context.JTASessionContext.currentSession(JTASessionContext.java:61) at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:604) at org.jboss.portal.core.impl.user.UserModuleImpl.getCurrentSession(UserModuleImpl.java:372) at org.jboss.portal.core.impl.user.UserModuleImpl.findUsers(UserModuleImpl.java:272) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:141) at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80) at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:118) at org.jboss.mx.server.Invocation.invoke(Invocation.java:74) at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:127) at org.jboss.mx.server.Invocation.invoke(Invocation.java:74) at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:245) at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:644) at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:176) at $Proxy220.findUsers(Unknown Source) at org.jboss.portal.core.portlet.user.UserPortlet.doView(UserPortlet.java:313) at my.package.MyUserPortlet.doView(MyUserPortlet.java:47) at org.jboss.portlet.JBossPortlet.doDispatch(JBossPortlet.java:230) at org.jboss.portlet.JBossPortlet.render(JBossPortlet.java:217) at org.jboss.portlet.JBossPortlet.render(JBossPortlet.java:360) at org.jboss.portal.portlet.PortletContainer.invokeRender(PortletContainer.java:521) at org.jboss.portal.portlet.PortletContainer.dispatch(PortletContainer.java:433) at org.jboss.portal.server.app.ComponentInvocation.dispatch(ComponentInvocation.java:79) at org.jboss.portal.server.invocation.Invocation.invokeNext(Invocation.java:140) at org.jboss.portal.core.aspects.component.TransactionInterceptor.invoke(TransactionInterceptor.java:72) at org.jboss.portal.server.app.ComponentInterceptor.invoke(ComponentInterceptor.java:38) at org.jboss.portal.server.invocation.Invocation.invokeNext(Invocation.java:130) at org.jboss.portal.core.aspects.component.HeaderInterceptor.invoke(HeaderInterceptor.java:50) at org.jboss.portal.server.app.ComponentInterceptor.invoke(ComponentInterceptor.java:38) at org.jboss.portal.server.invocation.Invocation.invokeNext(Invocation.java:130) at org.jboss.portal.server.aspects.component.NavigationInterceptor.invoke(NavigationInterceptor.java:76) at org.jboss.portal.server.app.ComponentInterceptor.invoke(ComponentInterceptor.java:38) at org.jboss.portal.server.invocation.Invocation.invokeNext(Invocation.java:130) at org.jboss.portal.server.aspects.component.CacheInterceptor.invoke(CacheInterceptor.java:167) at org.jboss.portal.server.app.ComponentInterceptor.invoke(ComponentInterceptor.java:38) at org.jboss.portal.server.invocation.Invocation.invokeNext(Invocation.java:130) at org.jboss.portal.server.aspects.component.ModesInterceptor.invoke(ModesInterceptor.java:88) at org.jboss.portal.server.app.ComponentInterceptor.invoke(ComponentInterceptor.java:38) at org.jboss.portal.server.invocation.Invocation.invokeNext(Invocation.java:130) at org.jboss.portal.server.aspects.component.WindowStatesInterceptor.invoke(WindowStatesInterceptor.java:87) at org.jboss.portal.server.app.ComponentInterceptor.invoke(ComponentInterceptor.java:38) at org.jboss.portal.server.invocation.Invocation.invokeNext(Invocation.java:130) at org.jboss.portal.bridge.BridgeInterceptor.invoke(BridgeInterceptor.java:49) at org.jboss.portal.server.app.ComponentInterceptor.invoke(ComponentInterceptor.java:38) at org.jboss.portal.server.invocation.Invocation.invokeNext(Invocation.java:130) at org.jboss.portal.portlet.aspects.component.SessionPostDispatchInterceptor.invoke(SessionPostDispatchInterceptor.java:65) at org.jboss.portal.server.app.ComponentInterceptor.invoke(ComponentInterceptor.java:38) at org.jboss.portal.server.invocation.Invocation.invokeNext(Invocation.java:130) at org.jboss.portal.server.aspects.component.ContextDispatcherInterceptor$InvokeNextCommand.execute(ContextDispatcherInterceptor.java:129) at sun.reflect.GeneratedMethodAccessor372.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.jboss.portal.server.servlet.CommandServlet.doGet(CommandServlet.java:101) at org.jboss.portal.server.servlet.CommandServlet.doPost(CommandServlet.java:149) .... more stack trace left out for clarity.
In looking at the stack trace it seems like the correct TransactionInterceptor is being called that should be starting a Hibernate transaction. Could the fact that MyUserPortlet is deployed in a different web application cause this error? Has anyone else had this problem?
JBoss AS 4.0.3SP1
JBoss Portal 2.2.1