Buenas a todos,
Lo primero de todo soy nuevo por este foro, así que perdonar si cometo algún error de novato.
Bueno al tema.
Estoy teniendo un problema con la configuración de Spring / MyBatis en las transacciones que maneja Spring (Eso es decisión mia ya que quiero que el contenedor Spring sea el que maneje la transaccionalidad en vez de myBatis)
En el fichero de configuración para myBatis tengo lo siguiente
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config />
<!--Las transacciones seran declaradas usando la anotacion "@Transactional" -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<beans:bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSou rceTransactionManager">
<beans:property name="dataSource" ref="dataSource" />
</beans:bean>
<beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<beans:property name="mapperLocations"
value="classpath:/com/personal/basket/dao/mybatis/*.xml" />
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="transactionFactory" ref="springManagedTransactionFactory" />
</beans:bean>
<beans:bean class="org.mybatis.spring.transaction.SpringManage dTransactionFactory" id="springManagedTransactionFactory">
<beans:constructor-arg index="0" ref="dataSource" />
</beans:bean>
<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<beans:property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<beans:property name="url" value="jdbc:hsqldb:hsql://localhost/testdb" />
<beans:property name="username" value="sa" />
<beans:property name="password" value="" />
<beans:property name="initialSize" value="6"/>
<beans:property name="maxActive" value="10"/>
</beans:bean>
<!-- Mapeo de la tabla -->
<beans:bean id="configuracionMapper" class="org.mybatis.spring.mapper.MapperFactoryBean ">
<beans:property name="mapperInterface" value="com.personal.basket.dao.ConfiguracionMapper " />
<beans:property name="sqlSessionFactory" ref="sqlSessionFactory" />
</beans:bean>
</beans:beans>
Hasta aquí el fichero de configuración de myBatis en Spring.
@Service("catalogoServicio")
public class CatalogoServicios implements ICatalogoServicios{
@Autowired
ConfiguracionMapper configuracionMapper;
@Transactional
public void f1()throws Exception{
......
......
......
ConfiguracionDTO cDTO = new ConfiguracionDTO();
cDTO.setParametro("A");
cDTO.setValor("b");
configuracionMapper.insert(cDTO);
......
......
......
}
}
Pues si elimino del código @Transactional todo funciona bien pero si lo dejo puesto me da un problema al arrancar el servidor de aplicaciones.
GRAVE: StandardWrapper.Throwable
org.springframework.beans.factory.BeanCreationExce ption: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationExce ption: Could not autowire field: com.personal.basket.servicios.CatalogoServicios com.personal.basket.HomeController.catalogoServici o; nested exception is java.lang.IllegalArgumentException: Can not set com.personal.basket.servicios.CatalogoServicios field com.personal.basket.HomeController.catalogoServici o to $Proxy15
at org.springframework.beans.factory.annotation.Autow iredAnnotationBeanPostProcessor.postProcessPropert yValues(AutowiredAnnotationBeanPostProcessor.java: 287)
at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.populateBean(AbstractAu towireCapableBeanFactory.java:1106)
Al eliminar @Transactional el problema es que si falla una operación dentro del método todo lo anterior si se han realizado insert/update/delete se queda commiteado y eso no puede ser. Así pues, necesito el @Transactional
Un saludo y gracias.
Iván