Thank you for your advice, Sergey.
Sergey Podatelev wrote: > > Okay, see, I'm far from being a Spring expert either. > > But as far as I understand your code, the following happens: > > Spring instantiates an instance of ProviderDAOImpl (a ProviderDAOImpl > bean) and provides it with jcrTemplate. > Now if you want an working instance of ProviderDAOImpl, you have to > access the bean configured in application context. > What you're doing instead is creating a new instance of > ProviderDAOImpl which is obviously never initialized. > > I' don't know whether you're using any additional frameworks which > have specific hooks for accessing Spring beans (like Wicket, for > instance), but here're a couple of links that describe what I believe > is a universal way to fetch your beans from the application context: > > http://sujitpal.blogspot.com/2007/03/accessing-spring-beans-from-legacy-code.html > http://blog.jdevelop.eu/2008/07/06/access-the-spring-applicationcontext-from-everywhere-in-your-application/ > > > > On Wed, Jul 8, 2009 at 11:41 PM, Gadbury<[email protected]> wrote: >> >> >> >> Sergey Podatelev wrote: >>> >>> How do you instantiate your ProviderDAOImpl? >>> You have Spring instantiating an instance of JackrabbitDaoImpl (thus >>> properly initializing SessionFactory), but does it ever instantiates >>> an instance of ProviderDAOImpl? >>> >> >> Hi Sergey. Thanks for your reply. I understand what you are saying. I >> have tried the following: >> >> ---------------------------------------- >> >> ProviderDAOImpl: >> >> public class ProviderDAOImpl extends JcrDaoSupport >> { >> private static Logger logger = >> Logger.getLogger(ProviderDAOImpl.class); >> >> public ProviderDAOImpl() >> { >> super(); >> } >> >> public ArrayList<ProviderBean> listProviders() >> { >> Session jcrSession = getSession(true); >> ArrayList<ProviderBean> providers = new >> ArrayList<ProviderBean>(); >> >> try >> { >> Workspace ws = jcrSession.getWorkspace(); >> QueryManager qm = ws.getQueryManager(); >> >> // Specify a query using the XPATH query language >> Query q = >> qm.createQuery("//provid...@isdeleted!='true']", Query.XPATH); >> QueryResult res = q.execute(); >> >> // Obtain a node iterator >> NodeIterator provs = res.getNodes(); >> logger.debug(provs.getSize()); >> >> while (provs.hasNext()) >> { >> Node providerNode = >> provs.nextNode(); >> providers.add( new >> ProviderBean(providerNode.getUUID(), >> >> providerNode.getProperty("name").getString(), >> >> providerNode.getProperty("GUID").getString(), >> >> providerNode.getProperty("isDeleted").getBoolean())); >> } >> >> } >> catch (Exception e) >> { >> logger.error(e.getCause(), e); >> } >> finally >> { >> >> } >> >> return providers; >> } >> } >> >> ---------------------------------------- >> >> applicationContext-jcr.xml: >> >> <?xml version="1.0" encoding="UTF-8"?> >> <beans xmlns="http://www.springframework.org/schema/beans" >> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >> xmlns:context="http://www.springframework.org/schema/context" >> xsi:schemaLocation=" >> http://www.springframework.org/schema/beans >> >> http://www.springframework.org/schema/beans/spring-beans.xsd >> >> http://www.springframework.org/schema/context >> >> http://www.springframework.org/schema/context/spring-context.xsd"> >> >> <!-- Register Annotation-based Post Processing Beans --> >> <context:annotation-config /> >> >> <!-- Creates a session factory based on the respository --> >> <bean id="sessionFactory" >> class="org.springmodules.jcr.JcrSessionFactory"> >> <property name="repository" ref="repository" /> >> <property name="credentials"> >> <bean class="javax.jcr.SimpleCredentials"> >> <constructor-arg index="0" >> value="userid" /> >> <!-- create the credentials using >> a bean factory --> >> <constructor-arg index="1"> >> <bean >> factory-bean="password" factory-method="toCharArray" /> >> </constructor-arg> >> </bean> >> </property> >> </bean> >> >> <!-- Create the password to return it as a char[] --> >> <bean id="password" class="java.lang.String"> >> <constructor-arg index="0" value="" /> >> </bean> >> >> <!-- Create a JcrTemplate using the session factory --> >> <bean id="jcrTemplate" class="org.springmodules.jcr.JcrTemplate"> >> <property name="sessionFactory" ref="sessionFactory" /> >> <property name="allowCreate" value="true" /> >> </bean> >> >> <!-- DAO configurations --> >> <bean id="jcrDaoProviderImpl" >> class="net.gb.mds.atl.ecommerce.dao.ProviderDAOImpl"> >> <property name="sessionFactory" >> ref="sessionFactory" /> >> <property name="template" ref="jcrTemplate" /> >> </bean> >> >> <!-- Repository definition --> >> <bean id="repository" >> class="org.springmodules.jcr.jackrabbit.RepositoryFactoryBean"> >> <property name="configuration" >> value="classpath:repository.xml" /> >> <property name="homeDir" >> value="file:C:/repository1" /> >> </bean> >> >> </beans> >> >> ---------------------------------------- >> >> With the above code, I have removed the previous superclass and now the >> ProviderDAOImpl extends directly from the spring-modules-jcr class >> JcrDaoSupport. >> >> I am also instantiating a ProviderDAOImpl Spring bean (id = >> jcrDaoProviderImpl), which should inject the template (I'm guessing that >> I >> do not need the second property to inject the sessionFactory into the >> ProviderDAOImpl bean as sessionFactory is a member of JcrTemplate and is >> already injected in to the jcrTemplate bean...) ? >> >> I still have the same problem. The code falls over at ProviderDAOImpl >> call >> of getSession(true), reporting that "No sessionFactory specified" >> (specifically at the Assert statement in the method doGetSession() of the >> class org.springmodules.jcr.SessionFactoryUtils). When I debug, the >> first >> time the jcrTemplate is injected. Thereafter, it fails (template == >> null). >> I instantiate my ProviderDAOImpl from the rest of my application's >> classes >> as follows: >> >> ProviderDAOImpl provDAO = new ProviderDAOImpl(); >> >> As I am new to Spring (and really just wanted to use the >> spring-modules-jcr >> lib for simple repository configuration / creation and (Jcr) Session >> management), I'm sure I must have missed out something important. >> >> Can the Spring ProviderDAOImpl bean (defined above) use any name as the >> bean >> id? >> >> Should I instantiate ProviderDAOImpl in some other way? >> >> Many thanks for your help. >> -- >> View this message in context: >> http://www.nabble.com/spring-modules-jcr---Implementing-Spring-based-DAOs-without-callbacks-tp24289110p24397985.html >> Sent from the Jackrabbit - Users mailing list archive at Nabble.com. >> >> > > > > -- > sp > > -- View this message in context: http://www.nabble.com/spring-modules-jcr---Implementing-Spring-based-DAOs-without-callbacks-tp24289110p24414004.html Sent from the Jackrabbit - Users mailing list archive at Nabble.com.
