spring-projects / spring-data-neo4j

Provide support to increase developer productivity in Java when using Neo4j. Uses familiar Spring concepts such as a template classes for core API usage and lightweight repository style data access.
http://spring.io/projects/spring-data-neo4j
Apache License 2.0
825 stars 619 forks source link

NoSuchMethodException: org.springframework.data.neo4j.repository.support.Neo4jRepositoryFactoryBean.<init>() [DATAGRAPH-1010] #1571

Closed spring-projects-issues closed 7 years ago

spring-projects-issues commented 7 years ago

Terence Mill opened DATAGRAPH-1010 and commented

Neo4jRepositoryFactoryBean needs a parameter for construcction (Repos Interface class=

public Neo4jRepositoryFactoryBean(Class<? extends T> repositoryInterface) {
        super(repositoryInterface);
    }

Why does the Factory not get the required param?

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-neo4j</artifactId>
            <version>1.5.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-neo4j</artifactId>
            <version>1.5.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-ogm-embedded-driver</artifactId>
            <version>2.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j</artifactId>
            <version>3.1.1</version>
            <scope>runtime</scope>
        </dependency>
@Configuration
@EnableNeo4jRepositories(basePackages = "com.adm.repository")//, transactionManagerRef = "neo4jTransactionManager")
@EnableTransactionManagement
@ComponentScan(basePackages = "com.adm")
public class Neo4jConfiguration {

    @Bean
    public org.neo4j.ogm.config.Configuration configuration() {
        org.neo4j.ogm.config.Configuration configuration = new org.neo4j.ogm.config.Configuration();
        configuration.driverConfiguration().setDriverClassName(EmbeddedDriver.class.getName());
        return configuration;
    }

    @Bean
    public SessionFactory sessionFactory(org.neo4j.ogm.config.Configuration configuration) {
        return new SessionFactory(configuration, "com.adm.model.dep");
    }

    @Bean
    public Neo4jTransactionManager neo4jTransactionManager(SessionFactory sessionFactory) {
        return new Neo4jTransactionManager(sessionFactory);
    }
}
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@NodeEntity
public class MicroserviceNode {

    public MicroserviceNode() {
        // default
    }

    public MicroserviceNode(String springApplicationId, String springApplicationName, Set<MicroserviceNode> consumes) {
        super();
        this.springApplicationId = springApplicationId;
        this.springApplicationName = springApplicationName;
        this.consumes = consumes;
    }

    @GraphId
    private Long id;

    /**
     * Application short name read from ${spring.application.id}.
     */
    private String springApplicationId;

    /**
     * Application name read from ${spring.application.name}.
     */
    private String springApplicationName;

    /**
     * List of APIs current microservice consumes.
     */
    @Relationship(type = "consumes", direction = Relationship.OUTGOING)
    private Set<MicroserviceNode> consumes;

    public String getSpringApplicationId() {
        return springApplicationId;
    }

    public void setSpringApplicationId(String springApplicationId) {
        this.springApplicationId = springApplicationId;
    }

    public String getSpringApplicationName() {
        return springApplicationName;
    }

    public void setSpringApplicationName(String springApplicationName) {
        this.springApplicationName = springApplicationName;
    }

    public Set<MicroserviceNode> getConsumes() {
        return consumes;
    }

    public void dependsOn(MicroserviceNode microserviceNode) {
        if (consumes == null) {
            consumes = new HashSet<>();
        }
        consumes.add(microserviceNode);
    }   

    public void setConsumes(Set<MicroserviceNode> consumes) {
        this.consumes = consumes;
    }

    public MicroserviceNode(String springApplicationId, String springApplicationName) {

        this.springApplicationId = springApplicationId;
        this.springApplicationName = springApplicationName;
    }
}
//@Repository
public interface MicroserviceRepository extends GraphRepository<MicroserviceNode> {
    MicroserviceNode findBySpringApplicationId(@Param("springApplicationId") String springApplicationId);
    MicroserviceNode findBySpringApplicationName(@Param("springApplicationName") String springApplicationName);
    @Query("MATCH (MicroserviceNode)<-[consumes]-(MicroserviceNode) RETURN m,r,a LIMIT {limit}")
    Collection<MicroserviceNode> graph(@Param("limit") int limit);
}
java.lang.IllegalStateException: Error processing condition on org.springframework.boot.devtools.autoconfigure.DevToolsDataSourceAutoConfiguration
    at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:64)
    at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:102)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$TrackedConditionEvaluator.shouldSkip(ConfigurationClassBeanDefinitionReader.java:436)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:127)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:116)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:333)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:243)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:98)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:678)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:520)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:760)
    at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:360)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:306)
    at com..core.MySpringApplication.runAndShutDownJvmAfterInit(MySpringApplication.java:115)
    at com..core.MySpringApplication.runAndShutDownJvmAfterInit(MySpringApplication.java:83)
    at com..adm.AdminServerApplication.main(AdminServerApplication.java:50)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'microserviceRepository': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.neo4j.repository.support.Neo4jRepositoryFactoryBean]: No default constructor found; nested exception is java.lang.NoSuchMethodException: org.springframework.data.neo4j.repository.support.Neo4jRepositoryFactoryBean.<init>()
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1109)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1054)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getSingletonFactoryBeanForTypeCheck(AbstractAutowireCapableBeanFactory.java:869)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:796)
    at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:544)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:449)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:417)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:411)
    at org.springframework.boot.devtools.autoconfigure.DevToolsDataSourceAutoConfiguration$DevToolsDataSourceCondition.getMatchOutcome(DevToolsDataSourceAutoConfiguration.java:130)
    at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47)
    ... 22 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.neo4j.repository.support.Neo4jRepositoryFactoryBean]: No default constructor found; nested exception is java.lang.NoSuchMethodException: org.springframework.data.neo4j.repository.support.Neo4jRepositoryFactoryBean.<init>()
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:85)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1102)
    ... 31 common frames omitted
Caused by: java.lang.NoSuchMethodException: org.springframework.data.neo4j.repository.support.Neo4jRepositoryFactoryBean.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.getDeclaredConstructor(Class.java:2178)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:80)
    ... 32 common frames omitted

No further details from DATAGRAPH-1010

spring-projects-issues commented 7 years ago

Nicolas Mervaillie commented

You are using incompatible versions. Please see the compatibility table here : https://docs.spring.io/spring-data/neo4j/docs/5.0.0.RC3/reference/html/#_compatibility

I suggest you have a look at this repository to configure Spring boot with SDN : https://github.com/neo4j-examples/neo4j-sdn-ogm-issue-report-template/blob/master/boot-1.5/pom.xml

As a side note, using JsonGenerators on the @GraphId annotated property is not a good idea : the id is to be generated by the database, if you try to assign it yourself you're going to have problems.