2017-01-25 10 views
0

Недавно я включил 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); 
} 

} 
+0

Какой менеджер транзакций вы настроили для Spring? – dunni

+0

Я добавил свой файл конфигурации, см. Выше - извините, shoulda написал это для начала. На данный момент я использую JpaTransactionManager.В моем jboss я использую jtaTransactionManager. –

+0

Конечно, он игнорируется. Вы настраиваете 'EntityManagerFactory' и не используете его. В принципе, вся ваша конфигурация бесполезна. Удалите метод getEntityManager() и поместите '@ PersistenceContext' в поле' private EntityManager'. Именно так вы должны получить «EntityManager» в первую очередь. Ваш код также опасен, поскольку вы только получаете «EntityManager» один раз, а не транзакционный. –

ответ

1

Сделки работает отлично, они просто не работают в вашей настройке. Это связано с тем, что вы работаете вокруг транзакционной привязки EntityManager из-за того, что вы ее воссоздаете.

В принципе, код для вашего TestServiceImpl является ошибочным. Вы должны удалить метод getEntityManager() и вместо этого аннотировать поле EntityManager с помощью @PersistenceContext.

@Service 
public class TestServiceImpl implements TestService { 

    public GeneralDAO generalDAO; 

    @PersistenceContext 
    private EntityManager em; 

    public TestServiceImpl(){} 

    @Transactional 
    public void transactionalTest() { 
     Something something = new Something(); 
     em.persist(something); 
    } 
} 

Это все, что вам нужно.

+0

Правильно, и вот почему. 'Transactional' работает только с * Container Managed EntityManager *, что означает тот, который вводится Spring (или JavaEE), используя' @ PersistenceContext'. Если у вас есть * Application Managed EntityManager *, что означает, что вы создаете его из вызова 'EntityManagerFactory.createEntityManager()', тогда ваш код отвечает за управление транзакциями и вызывает 'EntityManager.getTransaction(). Begin()' и ' EntityManager.getTransaction(). Commit() ' –

+0

Спасибо за советы ребятам. Я разместил некоторые обновления выше с последующим вопросом. Боковое замечание - Клаус, в действительности я мог использовать EntityManagerFactory.createEntityManager в прошлом без явного начала или совершения транзакций. Я просто использовал аннотации. –