Недавно я включил Spring в приложение Jboss. Я также собираю отдельное приложение, которое будет использовать некоторые из классов Spring. Вот мой Standalone источник:Spring Standalone не распознает @Transactional
@Component
public class StandaloneTest {
public static ApplicationContext context;
public static void main(String[] args) {
context = new AnnotationConfigApplicationContext(StandaloneSpringBeanConfiguration.class);
StandaloneTest test = context.getBean(StandaloneTest.class);
System.out.println(context);
test.startProcess();
}
public StandaloneTest() {
}
/**
* Start the main process
*/
private void startProcess() {
run();
}
private void run() {
TestService testService = context.getBean(TestService.class);
testService.transactionalTest();
System.out.println("finished");
}
Вот источник TestService:
@Service
public class TestServiceImpl implements TestService {
public GeneralDAO generalDAO;
private EntityManager em;
private EntityManagerFactory emf;
public TestServiceImpl(){}
@Transactional
public void transactionalTest() {
Something something = new Something();
getEntityManager().persist(something);
}
public EntityManager getEntityManager() {
if (em == null) {
emf = Persistence.createEntityManagerFactory("xxx");
em = emf.createEntityManager();
}
return em;
}
}
Когда я запускаю этот метод в моем сервере JBoss, аннотацию @Transactional работает, как ожидалось. Однако, когда я запускаю автономное приложение, аннотации @Transactional, похоже, игнорируются. Я не могу понять, почему.
Если кто-нибудь знает, что мне нужно сделать, чтобы заставить это работать или какие-либо идеи/комментарии, пожалуйста, поделитесь. Благодаря!
Update
Вот мой Конфигурационный файл:
@Configuration
@ComponentScan
@EnableTransactionManagement
public class StandaloneSpringBeanConfiguration {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setPersistenceUnitName("myPersistenceContext");
em.setDataSource(dataSource());
em.setPackagesToScan(new String[] { "xxx.xxx.xxx"});
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
// em.setJpaProperties(additionalProperties());
return em;
}
@Bean
public DataSource dataSource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/jboss_test");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
JpaTransactionManager transactionManager = new JpaTransactionManager(emf);
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
return new PersistenceExceptionTranslationPostProcessor();
}
Больше Обновления
@Service
public class TestServiceImpl implements TestService {
public GeneralDAO generalDAO;
@PersistenceContext
private EntityManager em;
private EntityManagerFactory emf;
public TestServiceImpl(){}
@Transactional
public void transactionalTest() {
Something something = new Something();
em.persist(something);
}
}
Это, безусловно, перемещение меня в правильном направлении. Я получаю эту ошибку сейчас: нет доступных JTA UserTransaction - укажите либо «userTransaction», либо «userTransactionName» или «transactionManager» или «transactionManagerName»
У меня возникли проблемы с выяснением причины, но проблема в моем выборе транзакцииManager? Я где-то читал, что мне нужно использовать JOTM или Atomikos для автономной работы, но я не думаю, что JOTM можно использовать весной 4, и Atomicos требует, чтобы я использовал Maven, что для меня не вариант. Использование JTATransactionManager дало мне тот же результат.
Рабочий раствор
JTA ошибка, казалось, разрешится сегодня утром. Не уверен, что произошло. Затем я должен был убедиться, что все необходимые пакеты были проверяемыми LocalContainerEntityManagerFactoryBean, потому что я получаю IllegalArgumentException Неизвестного объект
Config
public class StandaloneSpringBeanConfiguration {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[] { "xxx.xxx.xxx", "xxx.xxx.xxx"});
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
// em.setJpaProperties(additionalProperties());
return em;
}
@Bean
public DataSource dataSource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/jboss_test");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
return new PersistenceExceptionTranslationPostProcessor();
}
Класс обслуживания
@Service
public class TestServiceImpl implements TestService {
public GeneralDAO generalDAO;
@PersistenceContext
private EntityManager em;
private EntityManagerFactory emf;
public TestServiceImpl(){}
@Transactional
public void transactionalTest() {
Something something = new Something();
em.persist(something);
}
}
Какой менеджер транзакций вы настроили для Spring? – dunni
Я добавил свой файл конфигурации, см. Выше - извините, shoulda написал это для начала. На данный момент я использую JpaTransactionManager.В моем jboss я использую jtaTransactionManager. –
Конечно, он игнорируется. Вы настраиваете 'EntityManagerFactory' и не используете его. В принципе, вся ваша конфигурация бесполезна. Удалите метод getEntityManager() и поместите '@ PersistenceContext' в поле' private EntityManager'. Именно так вы должны получить «EntityManager» в первую очередь. Ваш код также опасен, поскольку вы только получаете «EntityManager» один раз, а не транзакционный. –