Hi all,
I am trying to implement the following example (Implementing Spring-based DAOs without callbacks), as here: https://springmodules.dev.java.net/d...ingle/#d0e1669
Within my DAO (which extends JackrabbitDAOSupport, which itself extends JcrDaoSupport), getSession(true) is throwing the following exception: java.lang.IllegalArgumentException: No sessionFactory specified.
Here is my code:
DAO:
JackrabbitDAOSupport:Code:public class ProviderDAOImpl extends JackrabbitDAOSupport { private static org.apache.log4j.Logger _lLogger = org.apache.log4j.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("//provider[@isDeleted!='true']", Query.XPATH); QueryResult res = q.execute(); // Obtain a node iterator NodeIterator provs = res.getNodes(); _lLogger.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) { _lLogger.fatal(e.getCause(), e); } finally { } return providers; } }
applicationContext-jcr.xml:Code:public class JackrabbitDAOSupport extends JcrDaoSupport { JcrSessionFactory sessionFactory; JcrTemplate template; public JackrabbitDAOSupport() { } }
I understand that I may need to inject the jcrTemplate into my DAO (as getSession() eventually calls template.getSessionFactory(), and in the debugger template == null).Code:<?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> <!-- Creates 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="jackrabbitDAOSupport" class="net.gb.mds.atl.ecommerce.dao.JackrabbitDAOSupport"> <property name="sessionFactory" ref="sessionFactory" /> <property name="template" ref="jcrTemplate" /> </bean> <!-- normal repository The first bean definition defines defines the Jackrabbit repository by specifying the configuration file to use and the location of the repository. If the repository doesn't already exist, it will be created on startup. --> <bean id="repository" class="org.springmodules.jcr.jackrabbit.RepositoryFactoryBean"> <!-- normal factory beans params --> <property name="configuration" value="classpath:repository.xml" /> <!-- use the target folder which will be cleaned --> <property name="homeDir" value="file:C:/repository1" /> </bean> </beans>
Please could someone help me out? I've tried with and without using the JackrabbitDAOSupport class (i.e. in the spring config file). I've read over and over the tutorial example but it seems that some information is missing (or more likely I am doing something daft). Running through the debugger I can see that the initial call to JcrDaoSupport's setSessionFactory() is correctly instantiating the member template.
Thanks in advance for any help.


