Announcement Announcement Module

Spring Modules forum decommissioned in favor of Spring Extensions

As the Spring Modules project has been replaced by the Spring Extensions ( project, this forum has been decommissioned in favour of Spring Extensions one at:

Please see the Spring Extensions home page for a complete list of current projects in Java, .NET and ActionScript. You can also propose one if you want.

Costin Leau
SpringSource - Spring Training, Consulting, and Support - "From the Source"
See more
See less
spring-modules-jcr - Implementing Spring-based DAOs without callbacks Page Title Module
Move Remove Collapse
Conversation Detail Module
  • Filter
  • Time
  • Show
Clear All
new posts

  • spring-modules-jcr - Implementing Spring-based DAOs without callbacks

    Hi all,

    I am trying to implement the following example (Implementing Spring-based DAOs without callbacks), as here:

    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:

    public class ProviderDAOImpl extends JackrabbitDAOSupport
    	private static org.apache.log4j.Logger _lLogger = org.apache.log4j.Logger.getLogger(ProviderDAOImpl.class);
    	public ProviderDAOImpl()
    	public ArrayList<ProviderBean> listProviders()
    		Session jcrSession = getSession(true);
    		ArrayList<ProviderBean> providers = new ArrayList<ProviderBean>();
    			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();
    			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;
    public class JackrabbitDAOSupport extends JcrDaoSupport
    	JcrSessionFactory sessionFactory;
    	JcrTemplate template;
    	public JackrabbitDAOSupport()
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns=""
    	xmlns:xsi="" xmlns:context=""
    	<!-- 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" />
    	<!-- create the password to return it as a char[] -->
    	<bean id="password" class="java.lang.String">
    		<constructor-arg index="0" value="" />
    	<!-- 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" />
    	<!-- DAO configurations -->
    	<bean id="jackrabbitDAOSupport"
    		<property name="sessionFactory" ref="sessionFactory" />
    		<property name="template" ref="jcrTemplate" />
    		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" />
    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).

    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.

  • #2
    Is anyone able to advise a Spring newbie, please? I'm still stuck with this and have spent quite some time trying to work it out. It seems that when my web app starts, the DAO's template is correctly set but later when I instantiate and use my DAO, getSession(true) fails as the DAO's template is null.

    Where / how should I set the DAO's template / template's sessionFactory?