8

When I tried to create relationship using spring code, I am getting Transaction manager error. I am using Mysql and Neo4j database in my project. I tries different solution but not able to resolve.

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

Pom.xml file as below

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
    </parent>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>1.5.10.RELEASE</version>
        </dependency>

        <!-- For Neo4J Graph Database -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-neo4j</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.9-rc</version>
        </dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>1.5.10.RELEASE</version>
</dependency>
 <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>

    </dependencies>

    <properties>
        <java.version>1.8</java.version>
        <thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
        <thymeleaf-layout-dialect.version>2.1.1</thymeleaf-layout-dialect.version>
    </properties>
</project>

Application.class

    @SpringBootApplication
    @EnableTransactionManagement
    @EntityScan("projectone.entities")
    public class Application {

        public static void main(String[] args) {
            //For Starting application
            ApplicationContext applicationContext=SpringApplication.run(Application.class, args);

        }
    }

Database Configuration file:

@Configuration
@EnableJpaRepositories(basePackages = {"projectone.mysql"},
        entityManagerFactoryRef = "dbEntityManager",
        transactionManagerRef = "dbTransactionManager")
@EnableTransactionManagement
public class DatabaseConfiguration {

     @Autowired


 private Environment env;
        @Bean
        @Primary
        public LocalContainerEntityManagerFactoryBean dbEntityManager() {
            LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
            em.setDataSource(dbDatasource());
            em.setPackagesToScan(new String[]{"projectone.mysql"});
            em.setPersistenceUnitName("dbEntityManager");
            HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
            em.setJpaVendorAdapter(vendorAdapter);

            HashMap<String, Object> properties = new HashMap<>();

            properties.put("hibernate.dialect",env.getProperty("hibernate.dialect"));
            properties.put("hibernate.show-sql",env.getProperty("jdbc.show-sql"));


            em.setJpaPropertyMap(properties);
            return em;
        }
        @Primary
        @Bean
        public DataSource dbDatasource() {
            DriverManagerDataSource dataSource
                    = new DriverManagerDataSource();
            dataSource.setDriverClassName(
                    env.getProperty("spring.datasource.driverClassName"));
            dataSource.setUrl(env.getProperty("spring.datasource.url"));
            dataSource.setUsername(env.getProperty("spring.datasource.username"));
            dataSource.setPassword(env.getProperty("spring.datasource.password"));
            return dataSource;
        }
        @Primary
        @Bean
        public PlatformTransactionManager dbTransactionManager() {
            JpaTransactionManager transactionManager
                    = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(
                    dbEntityManager().getObject());
            return transactionManager;
        }

}

I tried minimal configuration by removing the database configuration class. After that my application is not running and I am getting Person is not a managed Bean error.

enter image description here

If I use only @SpringBootApplication annotation then I am getting following Exception: It is throwing

    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mappingController': Unsatisfied dependency expressed through field 'branchService'; 
nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'branchServiceImplementaion': Unsatisfied dependency expressed through field 'branchRepository'; 

nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'branchRepository': Unsatisfied dependency expressed through method 'setSession' parameter 0; 

nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.data.neo4j.transaction.SharedSessionCreator#0': Cannot resolve reference to bean 'sessionFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.class]: Bean instantiation via factory method failed;

 nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.neo4j.ogm.session.SessionFactory]: Factory method 'sessionFactory' threw exception; nested exception is NullPointerException
Galaxy
  • 643
  • 1
  • 8
  • 24
  • Remove your `DatabaseConfiguration` class and place your `@SpringBootApplication` annotated class in the `projectone` base package. – M. Deinum Feb 19 '18 at 07:47
  • PDO : https://stackoverflow.com/questions/10719646/no-bean-named-transactionmanager-is-defined – Mehraj Malik Feb 19 '18 at 07:55
  • @M.Deinum My Application class is already in base package. If I remove database configuration class, Neo4J and MySQL entities conflicts and throws an error. – Galaxy Feb 20 '18 at 03:58
  • You still don't need a full override of the spring configuration for that. I also don't see why they would conflict (could you add the exception). – M. Deinum Feb 20 '18 at 08:58
  • @M.Deinum I will try again that configuration and will post the exception – Galaxy Feb 20 '18 at 13:18
  • @M.Deinum I did the configuration as you said and tried other similar things also but I am not able to run the project. Person is not a managed BEan. I also attached the screen shot of this error in this post. – Galaxy Feb 21 '18 at 18:35
  • You have `@EntityScan` and that doesn't cover your mysql entities, so obviously you will get an exception. But why do you need this? The default configuration should be perfectly able to figure out what is Neo4J or JPA (the annotations and repositories are different). – M. Deinum Feb 21 '18 at 19:28
  • @M.Deinum In the default case(Only SpringBootApplication), It is not able to find my Neo4jService. I am having "MappingController" where I have "@AutoWired branchService" object to Neo4j Service "BranchService" class. Detailed Error I posted in the question. – Galaxy Feb 22 '18 at 02:22
  • @M.Deinum I have created separate question with basic configuration and getting some error. Please have a look https://stackoverflow.com/questions/48919998/neo4j-factory-method-sessionfactory-threw-exception-nested-exception-is-nullp – Galaxy Feb 22 '18 at 09:16

4 Answers4

16

Finally I found the mistake:

 @Bean
        public PlatformTransactionManager dbTransactionManager() {
            JpaTransactionManager transactionManager
                    = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(
                    dbEntityManager().getObject());
            return transactionManager;
        }

This section has mistake that caused the above issue. change @Bean to @Bean(name="transactionManager") and this solved the issue.

Galaxy
  • 643
  • 1
  • 8
  • 24
  • Adding this solved my problem. But the real cause was that I had one transitive dependency including spring-cloud-gcp-data-datastore in my classpath which was causing many conflicts – Manoel Stilpen Sep 14 '21 at 19:30
8

I had the same issue, but I was missing the transactionManagerRef = "dbTransactionManager" configuration in @EnableJpaRepositories

Julien Kronegg
  • 4,692
  • 1
  • 44
  • 55
  • This works when there is a custom datasource and transcation manager bean created which does not have the reference name as 'transactionManager'. For example : @ Configuration @ EnableTransactionManagement @ EnableJpaRepositories( transactionManagerRef = "customTxMgr", entityManagerFactoryRef = ".."}) public class InstrumentDatasourceConfig { @ Bean(name = "customTxMgr") public PlatformTransactionManager transactionManager(...){ } } – Kartik Narayana Maringanti May 23 '20 at 15:14
1

resolve: to change a name of function from:

public PlatformTransactionManager dbTransactionManager(){}

to:

public PlatformTransactionManager transactionManager(){}
mailtime
  • 61
  • 1
  • 7
0

I had the same problem and I noticed that there is an extra space where while specifying the transaction-manager as specified in the image. enter image description here