Проблемы с конфигурацией Spring Java и @EnableTransactionManagementJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Проблемы с конфигурацией Spring Java и @EnableTransactionManagement

Сообщение Anonymous »

Я перехожу с конфигурации XML на конфигурацию контекста Spring. Вместо этого, когда я пытаюсь использовать функционально эквивалентный @EnableTransactionManagement в конфигурации Java Spring 4.0.3.RELEASE, мой контекст Spring не может создать экземпляр со следующим исключением:

java.lang.IllegalStateException: не удалось загрузить ApplicationContext
в org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99)
на org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:101)
на org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependologies(DependencyInjectionTestExecutionListener.java:109)
на org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
на org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:319)
на org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:212)
на org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
в org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232)
на org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
на org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
на org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
на org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
на org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
на org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
на org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
на org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
в org.junit.runners.ParentRunner.run(ParentRunner.java:309)
в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:175)
в org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:236)
на org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:134)
на org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:113)
на sun.reflect.NativeMethodAccessorImpl.invoke0(собственный метод)
на sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
на sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
на java.lang.reflect.Method.invoke(Method.java:597)
на org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
на org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
на org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
на org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:103)
в org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:74)
Вызвано: org.springframework.beans.factory.BeanCreationException: ошибка создания Компонент с именем «baseMySQLTest.TestConfig»: не удалось инициализировать компонент; вложенным исключением является org.springframework.beans.factory.BeanCreationException: ошибка создания bean-компонента с именем «org.springframework.transaction.config.internalTransactionAdvisor», определенным в ресурсе пути к классу [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class]: создание экземпляра bean-компонента не удалось; вложенным исключением является org.springframework.beans.factory.BeanDefinitionStoreException: фабричный метод [public org.springframework.transaction.intercep...skipping...
в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1558)
в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
... еще 45
Вызвано: org.springframework.beans.factory.BeanDefinitionStoreException: Фабричный метод [public] org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration.transactionAdvisor()] выдал исключение; вложенным исключением является org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем «transactionInterceptor», определенным в ресурсе пути к классу [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class]: не удалось вызвать метод init; вложенным исключением является java.lang.IllegalArgumentException: требуется свойство «transactionManager»
в org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:188)
в org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:586)
... еще 62
Вызвано: org.springframework.beans.factory.BeanCreationException: ошибка создания bean-компонента с именем «transactionInterceptor», определенным в ресурсе пути к классу [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class]: не удалось вызвать метод init; вложенным исключением является java.lang.IllegalArgumentException: требуется свойство «transactionManager»
в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553)
в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
на org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
на org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
на org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
на org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
на org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:324)
на org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$83a12634.transactionInterceptor()
на org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration.transactionAdvisor(ProxyTransactionManagementConfiguration.java:45)
на org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$83a12634.CGLIB$transactionAdvisor$0()
на org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$83a12634$$FastClassBySpringCGLIB$$cc829ae.invoke()
на org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
в org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:312)
в org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$83a12634.transactionAdvisor()
на sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
на sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
на sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
на java.lang.reflect.Method.invoke(Method.java:597)
на org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:166)
... еще 63
Вызвано: java.lang.IllegalArgumentException: свойство 'transactionManager' требуется
в org.springframework.transaction.interceptor.TransactionAspectSupport.afterPropertiesSet(TransactionAspectSupport.java:195)
в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612)
на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549)
... еще 82

Это происходит в модульном тесте, но когда это работает здесь, я могу использовать его в рабочем коде.

Вот мой модуль тестовый базовый класс, в котором происходит связывание Spring:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {PropertyPlaceholderConfigurer.class, BaseMySQLTest.TestConfig.class})
public class BaseMySQLTest расширяет AbstractTransactionalJUnit4SpringContextTests {

@Configuration
@Import(DaoConfig.class)
@PropertySource("classpath:/jdbc.properties")
@EnableTransactionManagement
public static class TestConfig {
@Bean
public PlatformTransactionManager ProvideTransactionManager(ListableBeanFactory beanFactory) {
return new DataSourceTransactionManager(beanFactory.getBean(DataSource.class));
}


и вот подкласс, который использует этот базовый класс и конфигурацию:

публичный класс UserDaoImplTest расширяет BaseMySQLTest {

@Autowired
частный UserDao userDao;

@Test
public void testById() выдает исключение {
jdbcTemplate.execute("вставить в значения пользователей (email) ('bob@example.com')");
...

}


Как можно видеть, мой Spring TestConfig имеет определенный компонент менеджера транзакций, который, согласно Javadoc

http://docs.spring.io/spring/docs/3.1.x ... ement.html

, означает, что мне не нужно давать имя bean-компоненту (хотя я дал ему имя, пытаясь заставить это работать). Фактически, контекст Spring ведет себя так, как если бы он был настроен с помощью конфигурации XML, несмотря на отсутствие компонента с явным именем «transactionManager».

Чего не хватает в моей конфигурации Java, чтобы контекст Spring не мог использовать этот компонент менеджера транзакций для удовлетворения своих требований во время создания экземпляра?

Спасибо за любые полезные наблюдения.

РЕДАКТИРОВАТЬ:

(Я не уверен, куда следует внести это изменение, поэтому попробую здесь. ae6rt)

Вот новый тестовый класс, который приводит к той же ошибке, что и исходная работа:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {BaseMySQLTest.TestConfig.class})
публичный класс BaseMySQLTest расширяет AbstractTransactionalJUnit4SpringContextTests {

protected int LastInsertId() {
return jdbcTemplate.queryForInt("select LAST_INSERT_ID()");

@Autowired
Private UserDao userDao;

@Test
public void testById() выдает исключение {
jdbcTemplate.execute("вставить в значения mgdb.users (email) ('bob@example.com')");
int userId = LastInsertId();
Необязательный xoomUserOptional = userDao.byId(userId);
AssertThat(xoomUserOptional.isPresent(), EqualTo(true));
XoomUser user = xoomUserOptional.get();
AssertThat(user.getEmailAddress(), равныйTo("bob@example.com"));

@Configuration
@Import(DaoConfig.class)
@PropertySource("classpath:/jdbc.properties")
@EnableTransactionManagement
public static class TestConfig {
@Bean
public PlatformTransactionManager ProvideTransactionManager(ListableBeanFactory beanFactory) {
return new DataSourceTransactionManager(beanFactory.getBean(DataSource.class));

}


Мне на самом деле здесь не нужна конфигурация свойств

@ContextConfiguration(classes = {BaseMySQLTest.TestConfig.class})

поэтому я удалил его. Надеюсь, это соответствует духу этого раунда.

Подробнее здесь: https://stackoverflow.com/questions/237 ... management
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»