diff --git a/.travis.yml b/.travis.yml index 9e1054ad90..8cbad5da4a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: java +sudo: false jdk: - oraclejdk8 - oraclejdk7 diff --git a/pom.xml b/pom.xml index 42547f8b8e..98cd2a80b3 100644 --- a/pom.xml +++ b/pom.xml @@ -20,15 +20,16 @@ org.mybatis mybatis-parent - 24 + 26 + mybatis-spring - 1.2.3 + 1.2.4 jar mybatis-spring - An easy-to-use Spring3 bridge for MyBatis sql mapping framework. + An easy-to-use Spring bridge for MyBatis sql mapping framework. http://www.mybatis.org/spring/ @@ -78,7 +79,7 @@ http://github.com/mybatis/spring scm:git:ssh://github.com/mybatis/spring.git scm:git:ssh://git@github.com/mybatis/spring.git - mybatis-spring-1.2.3 + mybatis-spring-1.2.4 GitHub Issue Management @@ -90,8 +91,9 @@ - github - gitsite:git@github.com/mybatis/spring.git + gh-pages + Mybatis GitHub Pages + git:ssh://git@github.com/mybatis/spring.git?gh-pages# @@ -101,7 +103,7 @@ Spring org.springframework.batch.*;resolution:=optional,* * - 3.2.13.RELEASE + 4.2.4.RELEASE @@ -109,7 +111,7 @@ org.mybatis mybatis - 3.3.0 + 3.3.1 provided @@ -129,7 +131,7 @@ org.springframework.batch spring-batch-infrastructure - 3.0.4.RELEASE + 3.0.6.RELEASE provided @@ -145,21 +147,21 @@ org.apache.derby derby - 10.11.1.1 + 10.12.1.1 test ognl ognl - 3.0.11 + 3.1.2 test cglib cglib - 3.1 + 3.2.0 test @@ -173,7 +175,7 @@ org.jboss.byteman byteman-bmunit - 3.0.1 + 3.0.3 test @@ -187,7 +189,7 @@ org.hsqldb hsqldb - 2.3.2 + 2.3.3 test diff --git a/src/main/java/org/mybatis/spring/SqlSessionFactoryBean.java b/src/main/java/org/mybatis/spring/SqlSessionFactoryBean.java index 30dff45c50..492eccc737 100644 --- a/src/main/java/org/mybatis/spring/SqlSessionFactoryBean.java +++ b/src/main/java/org/mybatis/spring/SqlSessionFactoryBean.java @@ -29,6 +29,7 @@ import org.apache.ibatis.builder.xml.XMLConfigBuilder; import org.apache.ibatis.builder.xml.XMLMapperBuilder; import org.apache.ibatis.executor.ErrorContext; +import org.apache.ibatis.io.VFS; import org.apache.ibatis.logging.Log; import org.apache.ibatis.logging.LogFactory; import org.apache.ibatis.mapping.DatabaseIdProvider; @@ -64,7 +65,8 @@ * @author Putthibong Boonbong * @author Hunter Presnall * @author Eduardo Macarron - * + * @author EddĂș MelĂ©ndez + * * @see #setConfigLocation * @see #setDataSource * @version $Id$ @@ -107,13 +109,15 @@ public class SqlSessionFactoryBean implements FactoryBean, In //issue #19. No default provider. private DatabaseIdProvider databaseIdProvider; + private Class vfs; + private ObjectFactory objectFactory; private ObjectWrapperFactory objectWrapperFactory; /** * Sets the ObjectFactory. - * + * * @since 1.1.2 * @param objectFactory */ @@ -123,7 +127,7 @@ public void setObjectFactory(ObjectFactory objectFactory) { /** * Sets the ObjectWrapperFactory. - * + * * @since 1.1.2 * @param objectWrapperFactory */ @@ -143,7 +147,7 @@ public DatabaseIdProvider getDatabaseIdProvider() { /** * Sets the DatabaseIdProvider. - * As of version 1.2.2 this variable is not initialized by default. + * As of version 1.2.2 this variable is not initialized by default. * * @since 1.1.0 * @param databaseIdProvider @@ -152,6 +156,14 @@ public void setDatabaseIdProvider(DatabaseIdProvider databaseIdProvider) { this.databaseIdProvider = databaseIdProvider; } + public Class getVfs() { + return this.vfs; + } + + public void setVfs(Class vfs) { + this.vfs = vfs; + } + /** * Mybatis plugin list. * @@ -376,6 +388,10 @@ protected SqlSessionFactory buildSqlSessionFactory() throws IOException { configuration.setObjectWrapperFactory(this.objectWrapperFactory); } + if (this.vfs != null) { + configuration.setVfsImpl(this.vfs); + } + if (hasLength(this.typeAliasesPackage)) { String[] typeAliasPackageArray = tokenizeToStringArray(this.typeAliasesPackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); @@ -426,6 +442,15 @@ protected SqlSessionFactory buildSqlSessionFactory() throws IOException { } } + if (this.databaseIdProvider != null) {//fix #64 set databaseId before parse mapper xmls + try { + configuration.setDatabaseId(this.databaseIdProvider.getDatabaseId(this.dataSource)); + } catch (SQLException e) { + throw new NestedIOException("Failed getting a databaseId", e); + } + } + + if (xmlConfigBuilder != null) { try { xmlConfigBuilder.parse(); @@ -446,14 +471,6 @@ protected SqlSessionFactory buildSqlSessionFactory() throws IOException { configuration.setEnvironment(new Environment(this.environment, this.transactionFactory, this.dataSource)); - if (this.databaseIdProvider != null) { - try { - configuration.setDatabaseId(this.databaseIdProvider.getDatabaseId(this.dataSource)); - } catch (SQLException e) { - throw new NestedIOException("Failed getting a databaseId", e); - } - } - if (!isEmpty(this.mapperLocations)) { for (Resource mapperLocation : this.mapperLocations) { if (mapperLocation == null) { diff --git a/src/main/java/org/mybatis/spring/SqlSessionTemplate.java b/src/main/java/org/mybatis/spring/SqlSessionTemplate.java index dac3da432d..e7b75d1cfe 100644 --- a/src/main/java/org/mybatis/spring/SqlSessionTemplate.java +++ b/src/main/java/org/mybatis/spring/SqlSessionTemplate.java @@ -36,6 +36,7 @@ import org.apache.ibatis.session.RowBounds; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; +import org.springframework.beans.factory.DisposableBean; import org.springframework.dao.support.PersistenceExceptionTranslator; /** @@ -68,12 +69,12 @@ * @author Putthibong Boonbong * @author Hunter Presnall * @author Eduardo Macarron - * + * * @see SqlSessionFactory * @see MyBatisExceptionTranslator * @version $Id$ */ -public class SqlSessionTemplate implements SqlSession { +public class SqlSessionTemplate implements SqlSession, DisposableBean { private final SqlSessionFactory sqlSessionFactory; @@ -370,11 +371,32 @@ public List flushStatements() { } /** - * Proxy needed to route MyBatis method calls to the proper SqlSession got - * from Spring's Transaction Manager - * It also unwraps exceptions thrown by {@code Method#invoke(Object, Object...)} to - * pass a {@code PersistenceException} to the {@code PersistenceExceptionTranslator}. - */ + * Allow gently dispose bean: + *
+  * {@code
+  *
+  * 
+  *  
+  * 
+  * }
+  *
+ * + * The implementation of {@link DisposableBean} forces spring context to use {@link DisposableBean#destroy()} method instead of {@link SqlSessionTemplate#close()} to shutdown gently. + * + * @see SqlSessionTemplate#close() + * @see org.springframework.beans.factory.support.DisposableBeanAdapter#inferDestroyMethodIfNecessary + * @see org.springframework.beans.factory.support.DisposableBeanAdapter#CLOSE_METHOD_NAME + */ + @Override + public void destroy() throws Exception { + } + + /** + * Proxy needed to route MyBatis method calls to the proper SqlSession got + * from Spring's Transaction Manager + * It also unwraps exceptions thrown by {@code Method#invoke(Object, Object...)} to + * pass a {@code PersistenceException} to the {@code PersistenceExceptionTranslator}. + */ private class SqlSessionInterceptor implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { diff --git a/src/main/java/org/mybatis/spring/mapper/ClassPathMapperScanner.java b/src/main/java/org/mybatis/spring/mapper/ClassPathMapperScanner.java index 26401a0b45..0342b2a47e 100644 --- a/src/main/java/org/mybatis/spring/mapper/ClassPathMapperScanner.java +++ b/src/main/java/org/mybatis/spring/mapper/ClassPathMapperScanner.java @@ -184,7 +184,7 @@ private void processBeanDefinitions(Set beanDefinitions) { // the mapper interface is the original class of the bean // but, the actual class of the bean is MapperFactoryBean - definition.getPropertyValues().add("mapperInterface", definition.getBeanClassName()); + definition.getConstructorArgumentValues().addGenericArgumentValue(definition.getBeanClassName()); // issue #59 definition.setBeanClass(this.mapperFactoryBean.getClass()); definition.getPropertyValues().add("addToConfig", this.addToConfig); diff --git a/src/main/java/org/mybatis/spring/mapper/MapperFactoryBean.java b/src/main/java/org/mybatis/spring/mapper/MapperFactoryBean.java index 333b4d4eb8..c3b8da8551 100644 --- a/src/main/java/org/mybatis/spring/mapper/MapperFactoryBean.java +++ b/src/main/java/org/mybatis/spring/mapper/MapperFactoryBean.java @@ -58,14 +58,13 @@ public class MapperFactoryBean extends SqlSessionDaoSupport implements Factor private boolean addToConfig = true; - + public MapperFactoryBean() { + } + public MapperFactoryBean(Class mapperInterface) { this.mapperInterface = mapperInterface; } - public MapperFactoryBean() { - } - /** * {@inheritDoc} */ diff --git a/src/test/java/org/mybatis/spring/ExecutorInterceptor.java b/src/test/java/org/mybatis/spring/ExecutorInterceptor.java index 3565e074ff..1b607255b4 100644 --- a/src/test/java/org/mybatis/spring/ExecutorInterceptor.java +++ b/src/test/java/org/mybatis/spring/ExecutorInterceptor.java @@ -46,6 +46,7 @@ final class ExecutorInterceptor implements Interceptor { private boolean closed; + @Override public Object intercept(Invocation invocation) throws Throwable { if ("commit".equals(invocation.getMethod().getName())) { ++this.commitCount; @@ -58,10 +59,12 @@ public Object intercept(Invocation invocation) throws Throwable { return invocation.proceed(); } + @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } + @Override public void setProperties(Properties properties) { // do nothing } diff --git a/src/test/java/org/mybatis/spring/SqlSessionFactoryBeanTest.java b/src/test/java/org/mybatis/spring/SqlSessionFactoryBeanTest.java index 5accf31ad3..e88368e162 100644 --- a/src/test/java/org/mybatis/spring/SqlSessionFactoryBeanTest.java +++ b/src/test/java/org/mybatis/spring/SqlSessionFactoryBeanTest.java @@ -20,6 +20,7 @@ import java.math.BigDecimal; import java.math.BigInteger; +import org.apache.ibatis.io.JBoss6VFS; import org.apache.ibatis.reflection.factory.DefaultObjectFactory; import org.apache.ibatis.reflection.factory.ObjectFactory; import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory; @@ -136,6 +137,7 @@ public void testSetConfigLocation() throws Exception { assertSame(factory.getConfiguration().getEnvironment().getDataSource(), dataSource); assertSame(factory.getConfiguration().getEnvironment().getTransactionFactory().getClass(), org.mybatis.spring.transaction.SpringManagedTransactionFactory.class); + assertSame(factory.getConfiguration().getVfsImpl(), JBoss6VFS.class); // properties explicitly set differently than the defaults in the config xml assertFalse(factory.getConfiguration().isCacheEnabled()); diff --git a/src/test/java/org/mybatis/spring/annotation/MapperScanTest.java b/src/test/java/org/mybatis/spring/annotation/MapperScanTest.java index a7991f740a..ee923e6bba 100644 --- a/src/test/java/org/mybatis/spring/annotation/MapperScanTest.java +++ b/src/test/java/org/mybatis/spring/annotation/MapperScanTest.java @@ -290,6 +290,7 @@ public static class AppConfigWithCustomMapperFactoryBean { public static class BeanNameGenerator implements org.springframework.beans.factory.support.BeanNameGenerator { + @Override public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry definitionRegistry) { return beanDefinition.getBeanClassName(); } diff --git a/src/test/java/org/mybatis/spring/asyncsynchronization/AsyncAfterCompletionHelper.java b/src/test/java/org/mybatis/spring/asyncsynchronization/AsyncAfterCompletionHelper.java index 672196a8b0..52d74a58a8 100644 --- a/src/test/java/org/mybatis/spring/asyncsynchronization/AsyncAfterCompletionHelper.java +++ b/src/test/java/org/mybatis/spring/asyncsynchronization/AsyncAfterCompletionHelper.java @@ -48,6 +48,7 @@ static class AsynchAfterCompletionInvocationHandler implements this.target = target; } + @Override public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { if ("afterCompletion".equals(method.getName())) { diff --git a/src/test/java/org/mybatis/spring/config/NamespaceTest.java b/src/test/java/org/mybatis/spring/config/NamespaceTest.java index 3dd52ae180..c09745b168 100644 --- a/src/test/java/org/mybatis/spring/config/NamespaceTest.java +++ b/src/test/java/org/mybatis/spring/config/NamespaceTest.java @@ -211,6 +211,7 @@ private void assertBeanNotLoaded(String name) { public static class BeanNameGenerator implements org.springframework.beans.factory.support.BeanNameGenerator { + @Override public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry definitionRegistry) { return beanDefinition.getBeanClassName(); } diff --git a/src/test/java/org/mybatis/spring/mapper/MapperImplementation.java b/src/test/java/org/mybatis/spring/mapper/MapperImplementation.java index db5a8e9a88..f25bb1cc22 100644 --- a/src/test/java/org/mybatis/spring/mapper/MapperImplementation.java +++ b/src/test/java/org/mybatis/spring/mapper/MapperImplementation.java @@ -20,6 +20,7 @@ */ // implementation of MapperInterface to test conflicting types final class MapperImplementation implements MapperInterface { + @Override public void method() { } } diff --git a/src/test/java/org/mybatis/spring/mapper/MapperScannerConfigurerTest.java b/src/test/java/org/mybatis/spring/mapper/MapperScannerConfigurerTest.java index 141fe77423..72172aee52 100644 --- a/src/test/java/org/mybatis/spring/mapper/MapperScannerConfigurerTest.java +++ b/src/test/java/org/mybatis/spring/mapper/MapperScannerConfigurerTest.java @@ -272,6 +272,7 @@ private void assertBeanNotLoaded(String name) { public static class BeanNameGenerator implements org.springframework.beans.factory.support.BeanNameGenerator { + @Override public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry definitionRegistry) { return beanDefinition.getBeanClassName(); } diff --git a/src/test/java/org/mybatis/spring/mybatis-config.xml b/src/test/java/org/mybatis/spring/mybatis-config.xml index e76a422548..c466ac8c05 100644 --- a/src/test/java/org/mybatis/spring/mybatis-config.xml +++ b/src/test/java/org/mybatis/spring/mybatis-config.xml @@ -28,6 +28,7 @@ + diff --git a/src/test/java/org/mybatis/spring/sample/dao/UserDaoImpl.java b/src/test/java/org/mybatis/spring/sample/dao/UserDaoImpl.java index 8ac2b86bdb..706ac85145 100644 --- a/src/test/java/org/mybatis/spring/sample/dao/UserDaoImpl.java +++ b/src/test/java/org/mybatis/spring/sample/dao/UserDaoImpl.java @@ -28,6 +28,7 @@ */ public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao { + @Override public User getUser(String userId) { return (User) getSqlSession().selectOne("org.mybatis.spring.sample.dao.UserDao.getUser", userId); } diff --git a/src/test/java/org/mybatis/spring/sample/domain/User.java b/src/test/java/org/mybatis/spring/sample/domain/User.java index 37b11f78b1..56379a7c15 100644 --- a/src/test/java/org/mybatis/spring/sample/domain/User.java +++ b/src/test/java/org/mybatis/spring/sample/domain/User.java @@ -42,6 +42,7 @@ public void setName(String name) { this.name = name; } + @Override public String toString() { StringBuilder buf = new StringBuilder(30); buf.append("{"); diff --git a/src/test/java/org/mybatis/spring/submitted/xa/UserServiceImpl.java b/src/test/java/org/mybatis/spring/submitted/xa/UserServiceImpl.java index 79892d9cb7..10a4d9665f 100644 --- a/src/test/java/org/mybatis/spring/submitted/xa/UserServiceImpl.java +++ b/src/test/java/org/mybatis/spring/submitted/xa/UserServiceImpl.java @@ -27,12 +27,14 @@ public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapperSlave; + @Override @Transactional public void saveWithNoFailure(User user) { userMapperMaster.save(user); userMapperSlave.save(user); } + @Override @Transactional public void saveWithFailure(User user) { userMapperMaster.save(user); @@ -40,6 +42,7 @@ public void saveWithFailure(User user) { throw new RuntimeException("failed!"); } + @Override public boolean checkUserExists(int id) { if (userMapperMaster.select(id) != null) return true; if (userMapperSlave.select(id) != null) return true; diff --git a/src/test/java/org/mybatis/spring/type/DummyMapperFactoryBean.java b/src/test/java/org/mybatis/spring/type/DummyMapperFactoryBean.java index 0a364c3e91..f61e5e6b1a 100644 --- a/src/test/java/org/mybatis/spring/type/DummyMapperFactoryBean.java +++ b/src/test/java/org/mybatis/spring/type/DummyMapperFactoryBean.java @@ -26,6 +26,14 @@ public class DummyMapperFactoryBean extends MapperFactoryBean { + public DummyMapperFactoryBean() { + super(); + } + + public DummyMapperFactoryBean(Class mapperInterface) { + super(mapperInterface); + } + private static final Logger LOGGER = Logger.getLogger(DummyMapperFactoryBean.class); private static final AtomicInteger mapperInstanceCount = new AtomicInteger(0); diff --git a/src/test/java/org/mybatis/spring/type/DummyTypeHandler.java b/src/test/java/org/mybatis/spring/type/DummyTypeHandler.java index 56e7a36d20..219606a8b9 100644 --- a/src/test/java/org/mybatis/spring/type/DummyTypeHandler.java +++ b/src/test/java/org/mybatis/spring/type/DummyTypeHandler.java @@ -31,17 +31,21 @@ @MappedTypes(BigInteger.class) public class DummyTypeHandler implements TypeHandler { + @Override public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { } + @Override public Object getResult(ResultSet rs, String columnName) throws SQLException { return null; } + @Override public Object getResult(CallableStatement cs, int columnIndex) throws SQLException { return null; } + @Override public Object getResult(ResultSet rs, int columnIndex) throws SQLException { return null; } diff --git a/src/test/java/org/mybatis/spring/type/DummyTypeHandler2.java b/src/test/java/org/mybatis/spring/type/DummyTypeHandler2.java index 010fc7ba53..f611ba6ac3 100644 --- a/src/test/java/org/mybatis/spring/type/DummyTypeHandler2.java +++ b/src/test/java/org/mybatis/spring/type/DummyTypeHandler2.java @@ -31,17 +31,21 @@ @MappedTypes(BigDecimal.class) public class DummyTypeHandler2 implements TypeHandler { + @Override public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { } + @Override public Object getResult(ResultSet rs, String columnName) throws SQLException { return null; } + @Override public Object getResult(CallableStatement cs, int columnIndex) throws SQLException { return null; } + @Override public Object getResult(ResultSet rs, int columnIndex) throws SQLException { return null; }