2016-09-16 1 views
0

ich Fehler erhalten Sie beim Versuch, Frühling Transaktionen zu verwenden:Spring verwendet „transaction“, obwohl ein anderes angegeben wurde

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined: No matching PlatformTransactionManager bean found for qualifier 'transactionManager' - neither qualifier match nor bean name match! 

Obwohl ich einen anderen Namen angegeben haben. Hier ist Code-Schnipsel:

@EnableTransactionManagement 
public class TransactionConfig { 
... 
    @Bean 
    @Qualifier(value ="jpaTransactionManager") 
public PlatformTransactionManager jpaTransactionManager(EntityManagerFactory emf) { 
    JpaTransactionManager tm = new JpaTransactionManager(); 
    tm.setEntityManagerFactory(emf); 
    tm.setDataSource(primaryDataSource()); 
    return tm; 
} 

    @Bean() 
    @Qualifier(value="jtaTransactionManager") 
    public JtaTransactionManager jtaTransactionManager(UserTransactionManager atomikosTransactionManager) { 
     ...... 

Und ich benutze es wie folgt aus:

@Transactional(transactionManager="jpaTransactionManager") 
public class UserService { 

public Iterable<FVUser> findWithQuery(Specification<FVUser> spec) { 
    return repository.findAll(spec); 
} 

Repository:

@Repository 
public interface UserRepository extends PagingAndSortingRepository<FVUser, String>, JpaSpecificationExecutor<FVUser> { 

Beim Debuggen Ich habe bemerkt, dass es richtig verwendet "jpaTransactionManger" Service-Methode aufrufen , scheint aber nach einem "transactionManager" zu suchen, um die Repository-Methode aufzurufen, obwohl für sie keine Transaktion angegeben ist.

Wer weiß warum Spring sucht in diesem Fall nach Standard "transactionManager" Bohne?

Danke.

Antwort

0

In Ihrem Frühjahrsdaten configs sollten Sie einen Parameter

@EnableJpaRepositories(transactionManagerRef = "jtaTransactionManager") 

der Standardwert hinzuzufügen ist "transaction"

+0

Ja. Das war die Lösung. Vielen Dank. – csm86

0

Ich denke, Sie sollten Ihre PlatformTransactionManager mit @Bean auch markieren.

Und fügen Sie @Transactional(transactionManager="jpaTransactionManager") auf Ihrem Repository hinzu. Die Implementierung verwendet standardmäßig @Transactional ohne Parameter, deshalb sucht sie nach dem Standard "transactionManager". Es wurde erklärt, there

+0

Es tut uns leid. Es ist eine Bohne. Ich habe es einfach aus Versehen übersprungen. Ich habe den Beitrag aktualisiert. – csm86

+0

Ich habe @Transactional (transactionManager = "jpaTransactionManager") auch im Repository hinzugefügt, aber das gleiche Ergebnis. Wie auch immer, ich möchte nicht, dass Repository-Methoden transaktional sind. Nur um die Service-Methode in Transaktion zu verpacken. – csm86

Verwandte Themen