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.

Reply via email to