You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jackrabbit.apache.org by Xavier <xc...@gmail.com> on 2008/02/20 19:06:10 UTC

[OCM] XAException when updating binary content

Hello,

I'm starting with Jackrabbit 1.4 w/ OCM + Spring 2.5 + SpringModules
When I want to update an existing node that contains binary data (byte[]), I
get the following error message in my test case :

org.springframework.transaction.TransactionSystemException: Could not commit
JCR transaction; nested exception is javax.transaction.RollbackException:
javax.transaction.xa.XAException



JUnit Test case :
This test insert a new node then updates the node and checks the retrieved
content is correct
        @Test
	public void testSaveAndRetrieve2ContentWithData() {
		// store content
		Content originalVersion = new Content(
				"/testSaveAndRetrieveStringContent", "a new content", data1,
				mimeType1);
		imageService.store(originalVersion);
		Content anotherVersion = new Content(
				"/testSaveAndRetrieveStringContent", "an even newer content",
				data2, mimeType2);
		imageService.store(anotherVersion);
		Content retrievedVersion = imageService
				.findByPath("/testSaveAndRetrieveStringContent");
		Assert.assertEquals("Contents should be equal", anotherVersion
				.getTitle(), retrievedVersion.getTitle());
	}

Domain Model:

@Node(jcrType="nt:unstructured", 
		jcrMixinTypes = "mix:versionable,mix:referenceable,mix:lockable")
public class Content {

	/** Node path in the CR */
	@Field(path=true)
	private String path;

	@Field(uuid=true)
	private String uuid;
	
	@Field(jcrName = "test:lastModified")
	private Calendar lastModified;

	/** content title */
	@Field(jcrName = "test:title")
	private String title = null;

	@Field(jcrName = "test:mimeType")
	private String mimeType;

	@Field(jcrName = "test:data")
	private byte[] data;
	

ServiceImpl:

       public void store(Content content) {
		// check no node with the same path already exists,
		// otherwise, create a new version of the same node
		content.setLastModified(new GregorianCalendar());
		if(findByPath(content.getPath()) == null) {
			LOG.warn("Inserting the new content with path " + content.getPath());
			jcrMappingTemplate.insert(content);
			jcrMappingTemplate.save();
		} else { 
			LOG.warn("Updating the content with path " + content.getPath());
			// find previous version in repository
			Content original =
(Content)jcrMappingTemplate.getObject(content.getPath());
			// copy all properties
			original.setData(content.getData());
			original.setLastModified(content.getLastModified());
			original.setMimeType(content.getMimeType());
			original.setTitle(content.getTitle());
			// perform update
			jcrMappingTemplate.checkout(original.getPath());
			jcrMappingTemplate.update(original);
			jcrMappingTemplate.save();
			jcrMappingTemplate.checkin(original.getPath());
		}
	}

Spring Config:
<!-- annotation-config activation is triggered by component-scan -->
  <context:component-scan base-package="sample" />

  <context:property-placeholder location="classpath:repository.properties"
/>
  
  <!-- enable the configuration of transactional behavior based on
annotations --> 
  <tx:annotation-driven transaction-manager="jcrTransactionManager" /> 

  <bean id="jcrTransactionManager"
    class="org.springmodules.jcr.jackrabbit.LocalTransactionManager">
    <property name="sessionFactory" ref="jcrSessionFactory" />
  </bean>

  <bean id="jcrRepository"
class="org.springmodules.jcr.jackrabbit.RepositoryFactoryBean">
    <!-- normal factory beans params -->
    <property name="configuration" value="classpath:jackrabbit-repo.xml" />
    <property name="homeDir" value="file:D:/tmp/repository" />
  </bean>

  <bean id="jcrSessionFactory"
    class="org.springmodules.jcr.jackrabbit.ocm.JackrabbitSessionFactory">
    <property name="repository" ref="jcrRepository" />
    <property name="credentials" ref="jcrCredentials" />
    <property name="nodeTypes2Import"
value="classpath:nodetypes/custom_nodetypes.xml" />
    <property name="namespaces">
      <util:properties>
        <prop key="ocm">http://jackrabbit.apache.org/ocm</prop>
        <prop key="test">http://test</prop>
      </util:properties>
    </property>
    <property name="sessionHolderProviderManager"
ref="sessionHolderProviderManager" />
  </bean>

  <bean name="sessionHolderProviderManager"
    class="org.springmodules.jcr.support.ListSessionHolderProviderManager">
    <property name="providers">
      <list>
        <bean
class="org.springmodules.jcr.jackrabbit.support.JackRabbitSessionHolderProvider"
/>
      </list>
    </property>
  </bean>

  <!-- JCR Credentials -->
  <bean id="jcrCredentials" class="javax.jcr.SimpleCredentials">
    <constructor-arg index="0" value="${jcr.connection.username}" />
    <constructor-arg index="1">
      <bean factory-bean="jcrCredentialsPassword"
factory-method="toCharArray" />
    </constructor-arg>
  </bean>
  <bean id="jcrCredentialsPassword" class="java.lang.String">
    <constructor-arg index="0" value="${jcr.connection.password}" />
  </bean>

  <bean id="mapper"
class="org.springmodules.jcr.jackrabbit.ocm.JcrMapperFactoryBean">
    <property name="classes">
      <list>
        <value>sample.domain.Content</value>
      </list>
    </property>
  </bean>

  <bean id="jcrMappingTemplate"
class="org.springmodules.jcr.jackrabbit.ocm.JcrMappingTemplate">
    <property name="sessionFactory" ref="jcrSessionFactory" />
    <property name="mapper" ref="mapper" />
    <property name="allowCreate" value="true" />
  </bean>



Can you tell what's wrong with this ? 
Thank you in advance
Xavier

-- 
View this message in context: http://www.nabble.com/-OCM--XAException-when-updating-binary-content-tp15595036p15595036.html
Sent from the Jackrabbit - Users mailing list archive at Nabble.com.


Re: [OCM] XAException when updating binary content

Posted by Christophe Lombart <ch...@gmail.com>.
ok thanks for the feedback

Christophe


On Thu, Feb 21, 2008 at 9:15 AM, Xavier Coulon <xc...@gmail.com> wrote:

> Hello Christophe,
>
> Ohoh ! I just upgraded the jackrabbit-core package to the version
> 1.4.1released yesterday and the problem is fixed ;-)
>
>
> If you're still interested in the stacktrace, here it is when using the
> jackrabbit-core-1.4 :
>
> org.springframework.transaction.TransactionSystemException: Could not
> commit
> JCR transaction; nested exception is javax.transaction.RollbackException:
> javax.transaction.xa.XAException
>     at org.springmodules.jcr.jackrabbit.LocalTransactionManager.doCommit(
> LocalTransactionManager.java:195)
>    at
>
> org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit
> (AbstractPlatformTransactionManager.java:709)
>    at
>
> org.springframework.transaction.support.AbstractPlatformTransactionManager.commit
> (AbstractPlatformTransactionManager.java:678)
>    at
>
> org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning
> (TransactionAspectSupport.java:319)
>    at
> org.springframework.transaction.interceptor.TransactionInterceptor.invoke(
> TransactionInterceptor.java:116)
>    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed
> (
> ReflectiveMethodInvocation.java:171)
>    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(
> JdkDynamicAopProxy.java:204)
>    at $Proxy16.store(Unknown Source)
>    at
> sample.service.ContentServiceTestCase.testSaveAndRetrieve2ContentWithData(
> ContentServiceTestCase.java:122)
>    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.test.context.junit4.SpringTestMethod.invoke(
> SpringTestMethod.java:198)
>    at
> org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(
> SpringMethodRoadie.java:274)
>    at org.springframework.test.context.junit4.SpringMethodRoadie$2.run(
> SpringMethodRoadie.java:207)
>    at
>
> org.springframework.test.context.junit4.SpringMethodRoadie.runBeforesThenTestThenAfters
> (SpringMethodRoadie.java:254)
>    at
>
> org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions
> (SpringMethodRoadie.java:234)
>    at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(
> SpringMethodRoadie.java:204)
>    at org.springframework.test.context.junit4.SpringMethodRoadie.run(
> SpringMethodRoadie.java:146)
>    at
>
> org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod
> (SpringJUnit4ClassRunner.java:151)
>    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(
> JUnit4ClassRunner.java:51)
>    at org.junit.internal.runners.JUnit4ClassRunner$1.run(
> JUnit4ClassRunner.java:44)
>    at org.junit.internal.runners.ClassRoadie.runUnprotected(
> ClassRoadie.java:27)
>    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java
> :37)
>    at org.junit.internal.runners.JUnit4ClassRunner.run(
> JUnit4ClassRunner.java:42)
>    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(
> JUnit4TestReference.java:38)
>    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(
> TestExecution.java:38)
>    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(
> RemoteTestRunner.java:460)
>    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(
> RemoteTestRunner.java:673)
>    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(
> RemoteTestRunner.java:386)
>    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(
> RemoteTestRunner.java:196)
> Caused by: javax.transaction.RollbackException:
> javax.transaction.xa.XAException
>    at
> org.springmodules.jcr.jackrabbit.support.JackRabbitUserTransaction.commit(
> JackRabbitUserTransaction.java:110)
>    at org.springmodules.jcr.jackrabbit.LocalTransactionManager.doCommit(
> LocalTransactionManager.java:192)
>    ... 31 more
>
>
> Regards,
> Xavier
>
> On Wed, Feb 20, 2008 at 8:46 PM, Christophe Lombart <
> christophe.lombart@gmail.com> wrote:
>
> > Hi Xavier,
> >
> > Do you have the stack trace ?
> >
> > Christophe
> >
> >
> > On Wed, Feb 20, 2008 at 7:06 PM, Xavier <xc...@gmail.com> wrote:
> >
> > >
> > > Hello,
> > >
> > > I'm starting with Jackrabbit 1.4 w/ OCM + Spring 2.5 + SpringModules
> > > When I want to update an existing node that contains binary data
> > (byte[]),
> > > I
> > > get the following error message in my test case :
> > >
> > > org.springframework.transaction.TransactionSystemException: Could not
> > > commit
> > > JCR transaction; nested exception is
> javax.transaction.RollbackException
> > :
> > > javax.transaction.xa.XAException
> > >
> > >
> > >
> > > JUnit Test case :
> > > This test insert a new node then updates the node and checks the
> > retrieved
> > > content is correct
> > >        @Test
> > >        public void testSaveAndRetrieve2ContentWithData() {
> > >                // store content
> > >                Content originalVersion = new Content(
> > >                                "/testSaveAndRetrieveStringContent", "a
> > new
> > > content", data1,
> > >                                mimeType1);
> > >                imageService.store(originalVersion);
> > >                Content anotherVersion = new Content(
> > >                                "/testSaveAndRetrieveStringContent",
> "an
> > > even newer content",
> > >                                data2, mimeType2);
> > >                imageService.store(anotherVersion);
> > >                Content retrievedVersion = imageService
> > >
> > >  .findByPath("/testSaveAndRetrieveStringContent");
> > >                Assert.assertEquals("Contents should be equal",
> > > anotherVersion
> > >                                .getTitle(), retrievedVersion.getTitle
> > ());
> > >        }
> > >
> > > Domain Model:
> > >
> > > @Node(jcrType="nt:unstructured",
> > >                jcrMixinTypes =
> > > "mix:versionable,mix:referenceable,mix:lockable")
> > > public class Content {
> > >
> > >        /** Node path in the CR */
> > >        @Field(path=true)
> > >        private String path;
> > >
> > >        @Field(uuid=true)
> > >        private String uuid;
> > >
> > >        @Field(jcrName = "test:lastModified")
> > >        private Calendar lastModified;
> > >
> > >        /** content title */
> > >        @Field(jcrName = "test:title")
> > >        private String title = null;
> > >
> > >        @Field(jcrName = "test:mimeType")
> > >        private String mimeType;
> > >
> > >        @Field(jcrName = "test:data")
> > >        private byte[] data;
> > >
> > >
> > > ServiceImpl:
> > >
> > >       public void store(Content content) {
> > >                // check no node with the same path already exists,
> > >                // otherwise, create a new version of the same node
> > >                content.setLastModified(new GregorianCalendar());
> > >                if(findByPath(content.getPath()) == null) {
> > >                        LOG.warn("Inserting the new content with path "
> +
> > > content.getPath());
> > >                        jcrMappingTemplate.insert(content);
> > >                        jcrMappingTemplate.save();
> > >                } else {
> > >                        LOG.warn("Updating the content with path " +
> > > content.getPath());
> > >                        // find previous version in repository
> > >                        Content original =
> > > (Content)jcrMappingTemplate.getObject(content.getPath());
> > >                        // copy all properties
> > >                        original.setData(content.getData());
> > >                        original.setLastModified(
> content.getLastModified
> > > ());
> > >                        original.setMimeType(content.getMimeType());
> > >                        original.setTitle(content.getTitle());
> > >                        // perform update
> > >                        jcrMappingTemplate.checkout(original.getPath
> ());
> > >                        jcrMappingTemplate.update(original);
> > >                        jcrMappingTemplate.save();
> > >                        jcrMappingTemplate.checkin(original.getPath());
> > >                }
> > >        }
> > >
> > > Spring Config:
> > > <!-- annotation-config activation is triggered by component-scan -->
> > >  <context:component-scan base-package="sample" />
> > >
> > >  <context:property-placeholder location="classpath:
> repository.properties
> > "
> > > />
> > >
> > >  <!-- enable the configuration of transactional behavior based on
> > > annotations -->
> > >  <tx:annotation-driven transaction-manager="jcrTransactionManager" />
> > >
> > >  <bean id="jcrTransactionManager"
> > >    class="org.springmodules.jcr.jackrabbit.LocalTransactionManager">
> > >    <property name="sessionFactory" ref="jcrSessionFactory" />
> > >  </bean>
> > >
> > >  <bean id="jcrRepository"
> > > class="org.springmodules.jcr.jackrabbit.RepositoryFactoryBean">
> > >    <!-- normal factory beans params -->
> > >    <property name="configuration" value="classpath:jackrabbit-repo.xml
> "
> > />
> > >    <property name="homeDir" value="file:D:/tmp/repository" />
> > >  </bean>
> > >
> > >  <bean id="jcrSessionFactory"
> > >    class="
> org.springmodules.jcr.jackrabbit.ocm.JackrabbitSessionFactory
> > ">
> > >    <property name="repository" ref="jcrRepository" />
> > >    <property name="credentials" ref="jcrCredentials" />
> > >    <property name="nodeTypes2Import"
> > > value="classpath:nodetypes/custom_nodetypes.xml" />
> > >    <property name="namespaces">
> > >      <util:properties>
> > >        <prop key="ocm">http://jackrabbit.apache.org/ocm</prop>
> > >        <prop key="test">http://test</prop>
> > >      </util:properties>
> > >    </property>
> > >    <property name="sessionHolderProviderManager"
> > > ref="sessionHolderProviderManager" />
> > >  </bean>
> > >
> > >  <bean name="sessionHolderProviderManager"
> > >    class="
> org.springmodules.jcr.support.ListSessionHolderProviderManager
> > ">
> > >    <property name="providers">
> > >      <list>
> > >        <bean
> > > class="
> > >
> org.springmodules.jcr.jackrabbit.support.JackRabbitSessionHolderProvider
> > "
> > > />
> > >      </list>
> > >    </property>
> > >  </bean>
> > >
> > >  <!-- JCR Credentials -->
> > >  <bean id="jcrCredentials" class="javax.jcr.SimpleCredentials">
> > >    <constructor-arg index="0" value="${jcr.connection.username}" />
> > >    <constructor-arg index="1">
> > >      <bean factory-bean="jcrCredentialsPassword"
> > > factory-method="toCharArray" />
> > >    </constructor-arg>
> > >  </bean>
> > >  <bean id="jcrCredentialsPassword" class="java.lang.String">
> > >    <constructor-arg index="0" value="${jcr.connection.password}" />
> > >  </bean>
> > >
> > >  <bean id="mapper"
> > > class="org.springmodules.jcr.jackrabbit.ocm.JcrMapperFactoryBean">
> > >    <property name="classes">
> > >      <list>
> > >        <value>sample.domain.Content</value>
> > >      </list>
> > >    </property>
> > >  </bean>
> > >
> > >  <bean id="jcrMappingTemplate"
> > > class="org.springmodules.jcr.jackrabbit.ocm.JcrMappingTemplate">
> > >    <property name="sessionFactory" ref="jcrSessionFactory" />
> > >    <property name="mapper" ref="mapper" />
> > >    <property name="allowCreate" value="true" />
> > >  </bean>
> > >
> > >
> > >
> > > Can you tell what's wrong with this ?
> > > Thank you in advance
> > > Xavier
> > >
> > > --
> > > View this message in context:
> > >
> >
> http://www.nabble.com/-OCM--XAException-when-updating-binary-content-tp15595036p15595036.html
> > > Sent from the Jackrabbit - Users mailing list archive at Nabble.com.
> > >
> > >
> >
>

Re: [OCM] XAException when updating binary content

Posted by Xavier Coulon <xc...@gmail.com>.
Hello Christophe,

Ohoh ! I just upgraded the jackrabbit-core package to the version
1.4.1released yesterday and the problem is fixed ;-)


If you're still interested in the stacktrace, here it is when using the
jackrabbit-core-1.4 :

org.springframework.transaction.TransactionSystemException: Could not commit
JCR transaction; nested exception is javax.transaction.RollbackException:
javax.transaction.xa.XAException
    at org.springmodules.jcr.jackrabbit.LocalTransactionManager.doCommit(
LocalTransactionManager.java:195)
    at
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit
(AbstractPlatformTransactionManager.java:709)
    at
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit
(AbstractPlatformTransactionManager.java:678)
    at
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning
(TransactionAspectSupport.java:319)
    at
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(
TransactionInterceptor.java:116)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(
ReflectiveMethodInvocation.java:171)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(
JdkDynamicAopProxy.java:204)
    at $Proxy16.store(Unknown Source)
    at
sample.service.ContentServiceTestCase.testSaveAndRetrieve2ContentWithData(
ContentServiceTestCase.java:122)
    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.test.context.junit4.SpringTestMethod.invoke(
SpringTestMethod.java:198)
    at
org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(
SpringMethodRoadie.java:274)
    at org.springframework.test.context.junit4.SpringMethodRoadie$2.run(
SpringMethodRoadie.java:207)
    at
org.springframework.test.context.junit4.SpringMethodRoadie.runBeforesThenTestThenAfters
(SpringMethodRoadie.java:254)
    at
org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions
(SpringMethodRoadie.java:234)
    at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(
SpringMethodRoadie.java:204)
    at org.springframework.test.context.junit4.SpringMethodRoadie.run(
SpringMethodRoadie.java:146)
    at
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod
(SpringJUnit4ClassRunner.java:151)
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(
JUnit4ClassRunner.java:51)
    at org.junit.internal.runners.JUnit4ClassRunner$1.run(
JUnit4ClassRunner.java:44)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(
ClassRoadie.java:27)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java
:37)
    at org.junit.internal.runners.JUnit4ClassRunner.run(
JUnit4ClassRunner.java:42)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(
JUnit4TestReference.java:38)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(
TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(
RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(
RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(
RemoteTestRunner.java:386)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(
RemoteTestRunner.java:196)
Caused by: javax.transaction.RollbackException:
javax.transaction.xa.XAException
    at
org.springmodules.jcr.jackrabbit.support.JackRabbitUserTransaction.commit(
JackRabbitUserTransaction.java:110)
    at org.springmodules.jcr.jackrabbit.LocalTransactionManager.doCommit(
LocalTransactionManager.java:192)
    ... 31 more


Regards,
Xavier

On Wed, Feb 20, 2008 at 8:46 PM, Christophe Lombart <
christophe.lombart@gmail.com> wrote:

> Hi Xavier,
>
> Do you have the stack trace ?
>
> Christophe
>
>
> On Wed, Feb 20, 2008 at 7:06 PM, Xavier <xc...@gmail.com> wrote:
>
> >
> > Hello,
> >
> > I'm starting with Jackrabbit 1.4 w/ OCM + Spring 2.5 + SpringModules
> > When I want to update an existing node that contains binary data
> (byte[]),
> > I
> > get the following error message in my test case :
> >
> > org.springframework.transaction.TransactionSystemException: Could not
> > commit
> > JCR transaction; nested exception is javax.transaction.RollbackException
> :
> > javax.transaction.xa.XAException
> >
> >
> >
> > JUnit Test case :
> > This test insert a new node then updates the node and checks the
> retrieved
> > content is correct
> >        @Test
> >        public void testSaveAndRetrieve2ContentWithData() {
> >                // store content
> >                Content originalVersion = new Content(
> >                                "/testSaveAndRetrieveStringContent", "a
> new
> > content", data1,
> >                                mimeType1);
> >                imageService.store(originalVersion);
> >                Content anotherVersion = new Content(
> >                                "/testSaveAndRetrieveStringContent", "an
> > even newer content",
> >                                data2, mimeType2);
> >                imageService.store(anotherVersion);
> >                Content retrievedVersion = imageService
> >
> >  .findByPath("/testSaveAndRetrieveStringContent");
> >                Assert.assertEquals("Contents should be equal",
> > anotherVersion
> >                                .getTitle(), retrievedVersion.getTitle
> ());
> >        }
> >
> > Domain Model:
> >
> > @Node(jcrType="nt:unstructured",
> >                jcrMixinTypes =
> > "mix:versionable,mix:referenceable,mix:lockable")
> > public class Content {
> >
> >        /** Node path in the CR */
> >        @Field(path=true)
> >        private String path;
> >
> >        @Field(uuid=true)
> >        private String uuid;
> >
> >        @Field(jcrName = "test:lastModified")
> >        private Calendar lastModified;
> >
> >        /** content title */
> >        @Field(jcrName = "test:title")
> >        private String title = null;
> >
> >        @Field(jcrName = "test:mimeType")
> >        private String mimeType;
> >
> >        @Field(jcrName = "test:data")
> >        private byte[] data;
> >
> >
> > ServiceImpl:
> >
> >       public void store(Content content) {
> >                // check no node with the same path already exists,
> >                // otherwise, create a new version of the same node
> >                content.setLastModified(new GregorianCalendar());
> >                if(findByPath(content.getPath()) == null) {
> >                        LOG.warn("Inserting the new content with path " +
> > content.getPath());
> >                        jcrMappingTemplate.insert(content);
> >                        jcrMappingTemplate.save();
> >                } else {
> >                        LOG.warn("Updating the content with path " +
> > content.getPath());
> >                        // find previous version in repository
> >                        Content original =
> > (Content)jcrMappingTemplate.getObject(content.getPath());
> >                        // copy all properties
> >                        original.setData(content.getData());
> >                        original.setLastModified(content.getLastModified
> > ());
> >                        original.setMimeType(content.getMimeType());
> >                        original.setTitle(content.getTitle());
> >                        // perform update
> >                        jcrMappingTemplate.checkout(original.getPath());
> >                        jcrMappingTemplate.update(original);
> >                        jcrMappingTemplate.save();
> >                        jcrMappingTemplate.checkin(original.getPath());
> >                }
> >        }
> >
> > Spring Config:
> > <!-- annotation-config activation is triggered by component-scan -->
> >  <context:component-scan base-package="sample" />
> >
> >  <context:property-placeholder location="classpath:repository.properties
> "
> > />
> >
> >  <!-- enable the configuration of transactional behavior based on
> > annotations -->
> >  <tx:annotation-driven transaction-manager="jcrTransactionManager" />
> >
> >  <bean id="jcrTransactionManager"
> >    class="org.springmodules.jcr.jackrabbit.LocalTransactionManager">
> >    <property name="sessionFactory" ref="jcrSessionFactory" />
> >  </bean>
> >
> >  <bean id="jcrRepository"
> > class="org.springmodules.jcr.jackrabbit.RepositoryFactoryBean">
> >    <!-- normal factory beans params -->
> >    <property name="configuration" value="classpath:jackrabbit-repo.xml"
> />
> >    <property name="homeDir" value="file:D:/tmp/repository" />
> >  </bean>
> >
> >  <bean id="jcrSessionFactory"
> >    class="org.springmodules.jcr.jackrabbit.ocm.JackrabbitSessionFactory
> ">
> >    <property name="repository" ref="jcrRepository" />
> >    <property name="credentials" ref="jcrCredentials" />
> >    <property name="nodeTypes2Import"
> > value="classpath:nodetypes/custom_nodetypes.xml" />
> >    <property name="namespaces">
> >      <util:properties>
> >        <prop key="ocm">http://jackrabbit.apache.org/ocm</prop>
> >        <prop key="test">http://test</prop>
> >      </util:properties>
> >    </property>
> >    <property name="sessionHolderProviderManager"
> > ref="sessionHolderProviderManager" />
> >  </bean>
> >
> >  <bean name="sessionHolderProviderManager"
> >    class="org.springmodules.jcr.support.ListSessionHolderProviderManager
> ">
> >    <property name="providers">
> >      <list>
> >        <bean
> > class="
> > org.springmodules.jcr.jackrabbit.support.JackRabbitSessionHolderProvider
> "
> > />
> >      </list>
> >    </property>
> >  </bean>
> >
> >  <!-- JCR Credentials -->
> >  <bean id="jcrCredentials" class="javax.jcr.SimpleCredentials">
> >    <constructor-arg index="0" value="${jcr.connection.username}" />
> >    <constructor-arg index="1">
> >      <bean factory-bean="jcrCredentialsPassword"
> > factory-method="toCharArray" />
> >    </constructor-arg>
> >  </bean>
> >  <bean id="jcrCredentialsPassword" class="java.lang.String">
> >    <constructor-arg index="0" value="${jcr.connection.password}" />
> >  </bean>
> >
> >  <bean id="mapper"
> > class="org.springmodules.jcr.jackrabbit.ocm.JcrMapperFactoryBean">
> >    <property name="classes">
> >      <list>
> >        <value>sample.domain.Content</value>
> >      </list>
> >    </property>
> >  </bean>
> >
> >  <bean id="jcrMappingTemplate"
> > class="org.springmodules.jcr.jackrabbit.ocm.JcrMappingTemplate">
> >    <property name="sessionFactory" ref="jcrSessionFactory" />
> >    <property name="mapper" ref="mapper" />
> >    <property name="allowCreate" value="true" />
> >  </bean>
> >
> >
> >
> > Can you tell what's wrong with this ?
> > Thank you in advance
> > Xavier
> >
> > --
> > View this message in context:
> >
> http://www.nabble.com/-OCM--XAException-when-updating-binary-content-tp15595036p15595036.html
> > Sent from the Jackrabbit - Users mailing list archive at Nabble.com.
> >
> >
>

Re: [OCM] XAException when updating binary content

Posted by Christophe Lombart <ch...@gmail.com>.
Hi Xavier,

Do you have the stack trace ?

Christophe


On Wed, Feb 20, 2008 at 7:06 PM, Xavier <xc...@gmail.com> wrote:

>
> Hello,
>
> I'm starting with Jackrabbit 1.4 w/ OCM + Spring 2.5 + SpringModules
> When I want to update an existing node that contains binary data (byte[]),
> I
> get the following error message in my test case :
>
> org.springframework.transaction.TransactionSystemException: Could not
> commit
> JCR transaction; nested exception is javax.transaction.RollbackException:
> javax.transaction.xa.XAException
>
>
>
> JUnit Test case :
> This test insert a new node then updates the node and checks the retrieved
> content is correct
>        @Test
>        public void testSaveAndRetrieve2ContentWithData() {
>                // store content
>                Content originalVersion = new Content(
>                                "/testSaveAndRetrieveStringContent", "a new
> content", data1,
>                                mimeType1);
>                imageService.store(originalVersion);
>                Content anotherVersion = new Content(
>                                "/testSaveAndRetrieveStringContent", "an
> even newer content",
>                                data2, mimeType2);
>                imageService.store(anotherVersion);
>                Content retrievedVersion = imageService
>
>  .findByPath("/testSaveAndRetrieveStringContent");
>                Assert.assertEquals("Contents should be equal",
> anotherVersion
>                                .getTitle(), retrievedVersion.getTitle());
>        }
>
> Domain Model:
>
> @Node(jcrType="nt:unstructured",
>                jcrMixinTypes =
> "mix:versionable,mix:referenceable,mix:lockable")
> public class Content {
>
>        /** Node path in the CR */
>        @Field(path=true)
>        private String path;
>
>        @Field(uuid=true)
>        private String uuid;
>
>        @Field(jcrName = "test:lastModified")
>        private Calendar lastModified;
>
>        /** content title */
>        @Field(jcrName = "test:title")
>        private String title = null;
>
>        @Field(jcrName = "test:mimeType")
>        private String mimeType;
>
>        @Field(jcrName = "test:data")
>        private byte[] data;
>
>
> ServiceImpl:
>
>       public void store(Content content) {
>                // check no node with the same path already exists,
>                // otherwise, create a new version of the same node
>                content.setLastModified(new GregorianCalendar());
>                if(findByPath(content.getPath()) == null) {
>                        LOG.warn("Inserting the new content with path " +
> content.getPath());
>                        jcrMappingTemplate.insert(content);
>                        jcrMappingTemplate.save();
>                } else {
>                        LOG.warn("Updating the content with path " +
> content.getPath());
>                        // find previous version in repository
>                        Content original =
> (Content)jcrMappingTemplate.getObject(content.getPath());
>                        // copy all properties
>                        original.setData(content.getData());
>                        original.setLastModified(content.getLastModified
> ());
>                        original.setMimeType(content.getMimeType());
>                        original.setTitle(content.getTitle());
>                        // perform update
>                        jcrMappingTemplate.checkout(original.getPath());
>                        jcrMappingTemplate.update(original);
>                        jcrMappingTemplate.save();
>                        jcrMappingTemplate.checkin(original.getPath());
>                }
>        }
>
> Spring Config:
> <!-- annotation-config activation is triggered by component-scan -->
>  <context:component-scan base-package="sample" />
>
>  <context:property-placeholder location="classpath:repository.properties"
> />
>
>  <!-- enable the configuration of transactional behavior based on
> annotations -->
>  <tx:annotation-driven transaction-manager="jcrTransactionManager" />
>
>  <bean id="jcrTransactionManager"
>    class="org.springmodules.jcr.jackrabbit.LocalTransactionManager">
>    <property name="sessionFactory" ref="jcrSessionFactory" />
>  </bean>
>
>  <bean id="jcrRepository"
> class="org.springmodules.jcr.jackrabbit.RepositoryFactoryBean">
>    <!-- normal factory beans params -->
>    <property name="configuration" value="classpath:jackrabbit-repo.xml" />
>    <property name="homeDir" value="file:D:/tmp/repository" />
>  </bean>
>
>  <bean id="jcrSessionFactory"
>    class="org.springmodules.jcr.jackrabbit.ocm.JackrabbitSessionFactory">
>    <property name="repository" ref="jcrRepository" />
>    <property name="credentials" ref="jcrCredentials" />
>    <property name="nodeTypes2Import"
> value="classpath:nodetypes/custom_nodetypes.xml" />
>    <property name="namespaces">
>      <util:properties>
>        <prop key="ocm">http://jackrabbit.apache.org/ocm</prop>
>        <prop key="test">http://test</prop>
>      </util:properties>
>    </property>
>    <property name="sessionHolderProviderManager"
> ref="sessionHolderProviderManager" />
>  </bean>
>
>  <bean name="sessionHolderProviderManager"
>    class="org.springmodules.jcr.support.ListSessionHolderProviderManager">
>    <property name="providers">
>      <list>
>        <bean
> class="
> org.springmodules.jcr.jackrabbit.support.JackRabbitSessionHolderProvider"
> />
>      </list>
>    </property>
>  </bean>
>
>  <!-- JCR Credentials -->
>  <bean id="jcrCredentials" class="javax.jcr.SimpleCredentials">
>    <constructor-arg index="0" value="${jcr.connection.username}" />
>    <constructor-arg index="1">
>      <bean factory-bean="jcrCredentialsPassword"
> factory-method="toCharArray" />
>    </constructor-arg>
>  </bean>
>  <bean id="jcrCredentialsPassword" class="java.lang.String">
>    <constructor-arg index="0" value="${jcr.connection.password}" />
>  </bean>
>
>  <bean id="mapper"
> class="org.springmodules.jcr.jackrabbit.ocm.JcrMapperFactoryBean">
>    <property name="classes">
>      <list>
>        <value>sample.domain.Content</value>
>      </list>
>    </property>
>  </bean>
>
>  <bean id="jcrMappingTemplate"
> class="org.springmodules.jcr.jackrabbit.ocm.JcrMappingTemplate">
>    <property name="sessionFactory" ref="jcrSessionFactory" />
>    <property name="mapper" ref="mapper" />
>    <property name="allowCreate" value="true" />
>  </bean>
>
>
>
> Can you tell what's wrong with this ?
> Thank you in advance
> Xavier
>
> --
> View this message in context:
> http://www.nabble.com/-OCM--XAException-when-updating-binary-content-tp15595036p15595036.html
> Sent from the Jackrabbit - Users mailing list archive at Nabble.com.
>
>