Во время запуска Spring warn-logging показывает ошибки при создании, например,
«bean с именем 'userRepositoryInterface' ... Не удалось вызвать метод инициализации; вложенное исключение - java.lang.IllegalArgumentException: требуется свойство 'sqlSessionFactory' или 'sqlSessionTemplate' "
В течение следующих нескольких минут это повторяется много раз для каждого RepositoryInterface, но в конце концов проблема решена, и приложение работает нормально. Но время запуска недопустимо. Кроме того, когда я добавил новый RepositoryInterface, время запуска увеличилось до 20 минут, пока на сервере (weblogic 12c) не закончилась память.
Реализующие классы этих RepositoryInterfaces созданы Spring / Mybatis (spring 4.1.3, mybatis 3.2.8 и mybatis-spring 1.2.2), который для этого сканирует (xml) файлы отображения.
Интерфейсы репозитория (DAO) автоматически подключаются к вызывающим их сервисным классам, например
@Autowired
private UserRepositoryInterface repository;
Интерфейсы репозитория помечены @Repository
У меня есть PersistenceConfigurer с аннотациями @Configuration
и @MapperScan
, который содержит два @Bean
метода:
- Источник данных Источник данных ()
- SqlSessionFactoryBean sqlSessionFactory (Источник данных Источник данных)
DataSource и sqlSessionFactory не вызываются до конца процесса запуска, что, кажется, является проблемой.
Я попытался изменить это, добавив @Order(0)
в PersistenceConfigurer, но это не помогло. Перемещение двух Bean-компонентов в другие классы Configuration также не имело положительного эффекта.
Для Spring я использую конфигурацию Java, без xml.
В ответ на комментарии вот весь PersistenceConfigurer:
package org.xx.xxxxxxx.configuration;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.jndi.JndiTemplate;
import javax.naming.NamingException;
import javax.sql.DataSource;
/**
* This class configures the application's persistence layer.
*/
@Configuration
@MapperScan(basePackages = "org.xx.xxxxxxx.repository")
public class PersistenceConfigurer {
static Logger LOGGER = LogManager.getLogger(PersistenceConfigurer.class);
@Value("${jdbc.datasource}")
private String jdbcDatasource; // in jdbc.properties: jdbc.datasource=jdbc/OurDS
@Value("classpath*:sqlmapper/*.xml")
private Resource[] mapperFiles;
@Value("classpath:mybatisConfig.xml")
private Resource myBatisConfig;
/**
* @return The configured data source.
*/
@Bean
public DataSource dataSource() {
JndiTemplate jndiTemplate = new JndiTemplate();
DataSource dataSource = null;
LOGGER.debug("Configuring datasource creating datasource with jndiname " + jdbcDatasource);
try {
// this works for weblogic, but not for Tomcat
dataSource = (DataSource) jndiTemplate.lookup(jdbcDatasource);
LOGGER.debug("Configuring datasource successfully created datasource " + dataSource);
} catch (NamingException e) {
LOGGER.error("Configuring datasource error creating datasource NamingException " + jdbcDatasource);
} catch (Exception e) {
LOGGER.error("Configuring datasource error creating datasource " + jdbcDatasource);
e.printStackTrace();
}
return dataSource;
}
/**
* @param dataSource A configured data source.
* @return The SQL session factory bean for data management.
*/
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
LOGGER.debug("sqlSessionFactory making SqlSessionFactoryBean with datasource " + dataSource);
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setMapperLocations(mapperFiles);
factoryBean.setConfigLocation(myBatisConfig);
return factoryBean;
}
}
@MapperScan
и один раз сfactoryBean.setMapperLocations(mapperFiles)
. Это проблема? - person Dave Syer   schedule 26.03.2015@Configuration
аннотированномWebMvcConfigurerAdapter
, файлах сообщений в@Bean
аннотированномMessageSource
, двух других в его@Bean
аннотированномPropertySourcesPlaceholderConfigurer
. - person JvdLinden   schedule 26.03.2015