Hi Salvatore
I am triyin to use se-jcr with out succes let me explain to you.
What I have?
I have a Spring MVC 3.1, Jackrabbit 2 (jcr 283)
Now I am using JCR but I am using it in the controller like follow:
repository =
RepositoryAccessServlet.getRepository(request.getSession().getServletContext();
jcrSession = repository.login(new
SimpleCredentials("admin","admin".toCharArray()));
What I like to do?
In order to follow a good MVC architecture I like to make all the jackrabbit
interaction in the DAO layer and not in the controller layer, there is where
I need se-jcr.
Like is not a good idea to sent the session from the controller to the
services and from the services to the DAO I like to get the session in the
DAO like follow:
web.XML first context-param
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
applicationContext.xml
...spring security stuff
<beans:bean id="repository"
class="org.springframework.extensions.jcr.jackrabbit.RepositoryFactoryBean"
p:configuration ="classpath:/repository.xml"
p:homeDir="file:./target/repo" >
</beans:bean>
<beans:bean id="jcrSessionFactory"
class="org.springframework.extensions.jcr.JcrSessionFactory">
<beans:property name="repository" ref="repository"/>
<beans:property name="credentials">
<beans:bean class="javax.jcr.SimpleCredentials">
<beans:constructor-arg index="0" value="bogus"/>
<beans:constructor-arg index="1" value="pass"/>
</beans:bean>
</beans:property>
</beans:bean>
<beans:bean id="jcrTemplate"
class="org.springframework.extensions.jcr.JcrTemplate">
<beans:property name="sessionFactory" ref="jcrSessionFactory"/>
<beans:property name="allowCreate" value="true"/>
</beans:bean>
As as test I trying to get the session not in the DAO but in the service
Controller class:
AbstractRepositoryController has the returnJson method and json declaration
as a JsonObject
@Controller
public class NewController extends AbstractRepositoryController{
private ProductDaoImpl daoImpl;
@Autowired
private NewController(ProductDaoImpl daoImpl){
this.daoImpl = daoImpl;
}
@RequestMapping("main/test1")
protected void test1(HttpServletRequest request, HttpServletResponse
response){
try {
daoImpl.saveSmth();
json.put("ok", "todoOk");
} catch (Exception e) {
e.printStackTrace();
}
returnJson(json.toString(), response);
}
}
Service class:
@Service
public class ProductDaoImpl extends JcrDaoSupport {
public void saveSmth() throws DataAccessException{
Session session = getSession();
try {
Node root = session.getRootNode();
Node sample = root.addNode("sample node");
sample.setProperty("sample property", "bla bla");
session.save();
}
catch (RepositoryException ex) {
throw convertJcrAccessException(ex);
}
}
}
What is going on?
When spring is starting check at NewController and try to get ProductDaoImpl
then it fails, with the following output:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error
creating bean with name 'newController'
[.../controllers/main/NewController.class]: Unsatisfied dependency expressed
through constructor argument with index 0 of type
[...services.ProductDaoImpl]: : Error creating bean with name
'productDaoImpl' defined in file [.../services/ProductDaoImpl.class]:
Invocation of init method failed; nested exception is
java.lang.IllegalArgumentException: sessionFactory or jcrTemplate is
required;
The line above is the first line of the exception but kind of say where the
problem is, as I understand it ProductDaoImpl could not be created because
there are not sessionFactory or jcrTemplate.
Here is where I do not get the problem, I did define the sessionFactory and
jcrTemplate in the applicationContext.xml.
Then I thought could it be that when spring is starting there is not
session? I mean it make sense because is just starting no request have yet
arrive to the controller, so what I did was remove the Autowired tag and the
code looks like follow:
Controller class:
@Controller
public class NewController extends AbstractRepositoryController{
private ProductDaoImpl daoImpl;
@RequestMapping("main/test1")
protected void test1(HttpServletRequest request, HttpServletResponse
response){
daoImpl = new ProductDaoImpl();
try {
daoImpl.saveSmth();
json.put("ok", "todoOk");
} catch (Exception e) {
e.printStackTrace();
}
returnJson(json.toString(), response);
}
}
Service class:
public class ProductDaoImpl extends JcrDaoSupport {
public void saveSmth() throws DataAccessException{
Session session = getSession();
try {
Node root = session.getRootNode();
Node sample = root.addNode("sample node");
sample.setProperty("sample property", "bla bla");
session.save();
}
catch (RepositoryException ex) {
throw convertJcrAccessException(ex);
}
}
}
And it keeps falling but this time is not at spring start up is when I make
the URL request and the controller try to make a ProductDaoImpl instance,
the output is the following:
java.lang.NullPointerException
at
org.springframework.extensions.jcr.support.JcrDaoSupport.getSession(JcrDaoSupport.java:96)
at com.test.ok.services.ProductDaoImpl.saveSmth(ProductDaoImpl.java:16)
at
com.test.ok.controllers.main.NewController.test1(NewController.java:29)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
at
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
at
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
at
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900)
at
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)
at
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
...So I do not know what else to do I need your expert help to have this
running or undertand what I am doing wrong.
Thanks a lot!
--
View this message in context:
http://jackrabbit.510166.n4.nabble.com/se-jcr-issue-with-jackrabbit-tp4355344p4355344.html
Sent from the Jackrabbit - Users mailing list archive at Nabble.com.