Hi again!
I'm really lost on this toppic. It seems to not work. First of all. Can someone post a complete configuration of a wicket portlet + spring, please? I found several ways to do it but none seems to be correct. Thank you. El mar, 18-08-2009 a las 09:53 +0200, nino martinez wael escribió: > Happy to help, please see further answers below. > > 2009/8/17 Gonzalo Aguilar Delgado <[email protected]>: > > > > > >> I have several suggestions. > >> > >> The order of the web filters are important. You could also try with > >> with the wicket spring managed apps, im not sure how that applies. > > > > Will check. I didn't know about filter order... Will also check it. > > Thanks! > > > > > >> > >> And are you sure that your filter ( /hibernate/*), get's hit? What's > >> your wicket filter url, the same or? > > > > > > No, It's different. Can I set it to just "/*"? Should I do it that way? > Well it depends, if the hibernate filter should be activated at the > same url's as wicket. > > I've never had a case where my wicket filter and osiw did not match. > You might have performance increases if they differ, for example if > you know that you willl never use hibernate on /myapp/ but always put > in /myapp/pages/dynamic/* for pages that use db lookup.. > > > > Thank you very much for your answers... > > > > > > > >> > >> 2009/8/17 Gonzalo Aguilar Delgado <[email protected]>: > >> > Ok. Maybe I don't understand... > >> > > >> > Let me show the situation. I have Spring + portlet + hibernate config > >> > with transactions working with the current configuration: > >> > > >> > I have my DAO objects under package > >> > com.level2crm.hibernate.enterprise.dao.contact > >> > And model under com.level2crm.model > >> > > >> > I configured one advice: > >> > <tx:advice id="txAdvice" transaction-manager="txManager"> > >> > <!-- the transactional semantics... --> > >> > <tx:attributes> > >> > <!-- all methods starting with 'get' are > >> > read-only --> > >> > <tx:method name="get*" propagation="REQUIRED" > >> > read-only="true" /> > >> > <!-- other methods use the default transaction > >> > settings (see below) > >> > --> > >> > <tx:method name="*" propagation="REQUIRED" /> > >> > <!-- > >> > propagation="SUPPORTS" --> > >> > </tx:attributes> > >> > </tx:advice> > >> > > >> > And several pointcuts: > >> > <aop:config> > >> > <aop:pointcut id="allModelOperation" > >> > expression="execution(* > >> > com.level2crm.model..*+.*(..))"/> > >> > <aop:advisor advice-ref="txAdvice" > >> > pointcut-ref="allModelOperation"/> > >> > </aop:config> > >> > > >> > <aop:config> > >> > <aop:pointcut id="allDAO" expression="execution(* > >> > com.level2crm.hibernate.enterprise.dao..*+.*(..))"/> > >> > <aop:advisor advice-ref="txAdvice" pointcut-ref="allDAO"/> > >> > </aop:config> > >> > > >> > <aop:config> > >> > <aop:pointcut id="TRG" expression="execution(* > >> > com.trg.dao.hibernate.*+.*(..))"/> > >> > <aop:advisor advice-ref="txAdvice" pointcut-ref="TRG"/> > >> > </aop:config> > >> > > >> > <!-- This one does not work --> > >> > <aop:config> > >> > <aop:pointcut id="portlets" expression="execution(* > >> > com.level2crm.portals.crm.wicket.customerlist.pages..*+.*(..))"/> > >> > <aop:advisor advice-ref="txAdvice" > >> > pointcut-ref="portlets"/> > >> > </aop:config> > >> > > >> > I tried to configure the open session in view (web.xml): > >> > <listener> > >> > > >> > <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> > >> > </listener> > >> > > >> > <!-- Enable the filters for Hibernate --> > >> > > >> > <filter> > >> > <filter-name>opensessioninview</filter-name> > >> > > >> > <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> > >> > </filter> > >> > <filter-mapping> > >> > <filter-name>opensessioninview</filter-name> > >> > <url-pattern>/hibernate/*</url-pattern> > >> > </filter-mapping> > >> > <!-- END hibernate filters --> > >> > > >> > > >> > > >> > But I found that this does not work. Because: > >> > > >> > > >> > public class ViewModePage extends org.apache.wicket.markup.html.WebPage > >> > { > >> > ... > >> > > >> > @SpringBean(name = "userDAOBean") > >> > private UserDAO userDAO; > >> > > >> > > >> > IModel loadableUserModel = new LoadableDetachableModel() { > >> > > >> > @Override > >> > protected Object load(){ > >> > User selectedUser = null; > >> > String value = > >> > ((PortletRequestContext)RequestContext.get()).getPortletRequest().getParameter("crmportal:userId"); > >> > if(value!=null) > >> > { > >> > UuidUserType uuid = > >> > UuidUserType.fromString(value); //Works!! > >> > userDAO.testSessoion(uuid);//Works!! > >> > > >> > selectedUser = > >> > userDAO.find(uuid);//Works!! > >> > > >> > if(!userDAO.isAttached(selectedUser)) > >> > //Works!! But is not > >> > attached!!! > >> > { > >> > > >> > userDAO.save(selectedUser); > >> > //Attach it //Works!! It > >> > saves/updates the object but it's still not attached > >> > } > >> > > >> > > >> > > >> > Set<ContactBasicDetail> setDetails = > >> > selectedUser.getContactBasicDetails(); //Works!! It gets the set > >> > setDetails.isEmpty(); // FAIL FAIL Cannot > >> > load lazy > >> > > >> > return setDetails.toArray(); > >> > } > >> > return null; > >> > } > >> > > >> > > >> > }; > >> > ... > >> > } > >> > > >> > > >> > This load() function does not work! It makes the exception. But: > >> > > >> > > >> > 1.- It can get the User. Because the pointcut works inside the > >> > DAO? > >> > 2.- It can save the object. Because the pointcut works inside > >> > the DAO? > >> > 3.- It can get the Set. Because the pointcut works inside the > >> > DAO? > >> > > >> > > >> > The userDAO.testSessoion(uuid); function inside the DAO object works. > >> > What I do is to get the Hibernate session, check that is ok. And check > >> > also if the transaction was created and I can attach and use object. > >> > Inside the userDAO.testSessoion function I do the same code that in the > >> > load() function but this time everything works! > >> > > >> > I'm sure that it works because it has a session and a open transaction > >> > due to the pointcut defined as follows works above: > >> > > >> > <aop:config> > >> > <aop:pointcut id="allDAO" expression="execution(* > >> > com.level2crm.hibernate.enterprise.dao..*+.*(..))"/> > >> > <aop:advisor advice-ref="txAdvice" pointcut-ref="allDAO"/> > >> > </aop:config> > >> > > >> > > >> > What is not working is the pointcut that should provide a > >> > transaction/session to the page: > >> > <!-- This one does not work --> > >> > <aop:config> > >> > <aop:pointcut id="portlets" expression="execution(* > >> > com.level2crm.portals.crm.wicket.customerlist.pages..*+.*(..))"/> > >> > <aop:advisor advice-ref="txAdvice" pointcut-ref="portlets"/> > >> > </aop:config> > >> > > >> > And I think this has something to do with the hibernate+wicket > >> > configuration. As the page is not created by the Spring bean interface > >> > it cannot > >> > make a proxy around it. So it will never get the session/transaction. > >> > > >> > > >> > Opening a session with the view manually will make my pointcuts not > >> > usable so I will loose the control over what classes > >> > will be managed and over transactions. Do will I? > >> > > >> > > >> > > >> > > >> >> >> Yup so you should either use open session in view or more preferred > >> >> >> AFAIK detachable models. > >> > > >> > Yep, I do it but it does not work. Indeed it fails inside the load() > >> > function. That makes me thing something is wrong configured... > >> > > >> > > >> > > >> > >> --------------------------------------------------------------------- > >> To unsubscribe, e-mail: [email protected] > >> For additional commands, e-mail: [email protected] > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected]
