This is a newbie question. I have been looking into Jackrabbit for a couple of weeks for a new project.
I am trying to implement a web app using Jackrabbit and Spring MVC.
I am accessing a Jackrabbit Server deployed in the method 3 architecture using the jcr-rmi interface.
I am using the jcr spring bean configuration specified on another thread:
I couldn't find a repository factory that accepted a rmi url, so I created my own.Code:<bean id="jcrSessionFactory" class="org.springmodules.jcr.JcrSessionFactory"> <property name="repository" ref="repository" /> <property name="credentials"> <bean class="javax.jcr.SimpleCredentials"> <constructor-arg index="0" value="bogus" /> <constructor-arg index="1" value="null" /> </bean> </property> </bean> <bean id="jcrTransactionManager" class="org.springmodules.jcr.jackrabbit.LocalTransactionManager"> <property name="sessionFactory" ref="jcrSessionFactory" /> </bean> <!-- transaction proxy for Jcr services/facades --> <bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="proxyTargetClass" value="true" /> <property name="transactionManager" ref="jcrTransactionManager" /> <property name="transactionAttributes"> <props> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED, readOnly</prop> </props> </property> </bean> <bean id="jcrSessionFactoryProxy" parent="txProxyTemplate" > <property name="target"> <ref bean="jcrSessionFactory"/> </property> </bean>
This extends the org.apache.jackrabbit.rmi.client.ClientRepositoryF actory.
The bean config and source code is:
I am storing i18n label content in the jackrabbit repository (as well as other stuff) and created aCode:<bean id="repository" class="com.jackrabbit.spring.RemoteClientRepositoryFactory"> <property name="rmiURI" value="//192.168.1.5:1099/jackrabbit.repository" /> </bean> package com.jackrabbit.spring; import javax.jcr.Repository; import org.apache.jackrabbit.rmi.client.ClientRepositoryFactory; public class RemoteClientRepositoryFactory extends org.springmodules.jcr.RepositoryFactoryBean{ private String rmiURI; private ClientRepositoryFactory factory = new ClientRepositoryFactory(); static { try { System.setProperty("java.rmi.server.useCodebaseOnly", "true"); } catch (Exception e) { e.printStackTrace(); } } protected Repository createRepository() throws Exception { Repository repository = factory.getRepository(rmiURI); return repository; } public void setRmiURI(String rmiURI) { this.rmiURI = rmiURI; } protected void resolveConfigurationResource() throws Exception { } }
org.springframework.context.MessageSource that is backed by a the jackrabbit repository (with an in-memory cache).
When I startup the tomcat instance I get the error 'No session bound to thread, and configuration does not allow creation of non-transactional one here'.
I am not sure if this error is related to the rmi repository or that I am attempting to access the repository in a MessageSource that is defined in the SpringMVC servlet.xml configuration.
The stack trace is
I am a bit stuck at this point?Code:java.lang.IllegalStateException: No session bound to thread, and configuration does not allow creation of non-transactional one here org.springmodules.jcr.SessionFactoryUtils.doGetSession(SessionFactoryUtils.java:74) org.springmodules.jcr.SessionFactoryUtils.getSession(SessionFactoryUtils.java:119) org.springmodules.jcr.support.JcrDaoSupport.getSession(JcrDaoSupport.java:104) org.springmodules.jcr.support.JcrDaoSupport.getSession(JcrDaoSupport.java:89) com.ubs.jackrabbit.DefaultRepositoryDAO.getAllLabels(DefaultRepositoryDAO.java:73) com.ubs.jackrabbit.JackrabbitMessageSource.initLabels(JackrabbitMessageSource.java:74) com.ubs.jackrabbit.JackrabbitMessageSource.getMessage(JackrabbitMessageSource.java:46) org.springframework.context.support.AbstractApplicationContext.getMessage(AbstractApplicationContext.java:697) org.springframework.context.support.MessageSourceResourceBundle.handleGetObject(MessageSourceResourceBundle.java:62) java.util.ResourceBundle.getObject(ResourceBundle.java:320) java.util.ResourceBundle.getString(ResourceBundle.java:286) org.apache.taglibs.standard.tag.common.fmt.MessageSupport.doEndTag(MessageSupport.java:171) org.apache.jsp.WEB_002dINF.jsp.structure.main_jsp._jspx_meth_fmt_message_0(main_jsp.java:139) org.apache.jsp.WEB_002dINF.jsp.structure.main_jsp._jspService(main_jsp.java:62) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:111) org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1051) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:727) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:396) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:350) javax.servlet.http.HttpServlet.service(HttpServlet.java:689) javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
Is this a valid way to use the rmi reposiotory? Can someone suggest a solution? It is not a requirement to be transactional, the website will be quite static.


