sglahn
sglahn

Reputation: 420

Spring Data Neo4j ClassFileProcessor loads no classes

I have a Spring Boot project which uses Spring Data Neo4j. When I run the project from my IDE(Intellij) everything works fine. When I run the project from command line(java -jar ...) I get the message that my entity is not an instance of a persistable class.

I pass the basePackages to the SessionFactory:

@Bean
public SessionFactory getSessionFactory() {
    return new SessionFactory(getConfiguration(), basePackages);
}

And I have annotated the main class with:

@EnableNeo4jRepositories(basePackages = "org.sgh.persistence")

The info log shows the following:

When started from Intellij:

2016-07-20 15:58:30.435  INFO 67581 --- [           main] o.s.d.neo4j.config.Neo4jConfiguration    : Initialising Neo4jSession
2016-07-20 15:58:30.443 DEBUG 67581 --- [           main] org.neo4j.ogm.scanner.ClassPathScanner   : Classpath elements:
2016-07-20 15:58:30.443 DEBUG 67581 --- [           main] org.neo4j.ogm.scanner.ClassPathScanner   : /Users/sebastianglahn/workspace/sandbox/spring-data-neo4j-example/build/classes/main/org/sgh/persistence
2016-07-20 15:58:30.447 DEBUG 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Processing: org.sgh.persistence.ExampleRepository -> java.lang.Object
2016-07-20 15:58:30.449 DEBUG 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Processing: org.sgh.persistence.TreeEntity -> java.lang.Object
2016-07-20 15:58:30.450  INFO 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Starting Post-processing phase
2016-07-20 15:58:30.450  INFO 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Building annotation class map
2016-07-20 15:58:30.450  INFO 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Building interface class map for 3 classes
2016-07-20 15:58:30.450 DEBUG 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  :  - ExampleRepository implements 1 interfaces
2016-07-20 15:58:30.450 DEBUG 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  :    - org.springframework.data.neo4j.repository.GraphRepository
2016-07-20 15:58:30.450 DEBUG 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  :  - TreeEntity implements 0 interfaces
2016-07-20 15:58:30.450 DEBUG 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  :  - Object implements 0 interfaces
2016-07-20 15:58:30.450 DEBUG 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Post-processing: org.sgh.persistence.ExampleRepository
2016-07-20 15:58:30.450 DEBUG 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  :  - No ClassInfo found for interface class: org.springframework.data.neo4j.repository.GraphRepository
2016-07-20 15:58:30.450 DEBUG 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Post-processing: org.sgh.persistence.TreeEntity
2016-07-20 15:58:30.450 DEBUG 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Checking for @Transient classes....
2016-07-20 15:58:30.450 DEBUG 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Registering converters and deregistering transient fields and methods....
2016-07-20 15:58:30.451  INFO 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Post-processing complete
2016-07-20 15:58:30.452  INFO 67581 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : 3 classes loaded in 11 milliseconds

When started from command line:

 2016-07-21 09:11:46.441  INFO 67991 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Starting Post-processing phase
2016-07-21 09:11:46.441  INFO 67991 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Building annotation class map
2016-07-21 09:11:46.441  INFO 67991 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Building interface class map for 0 classes
2016-07-21 09:11:46.441 DEBUG 67991 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Checking for @Transient classes....
2016-07-21 09:11:46.441 DEBUG 67991 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Registering converters and deregistering transient fields and methods....
2016-07-21 09:11:46.441  INFO 67991 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : Post-processing complete
2016-07-21 09:11:46.441  INFO 67991 --- [           main] o.neo4j.ogm.metadata.ClassFileProcessor  : 0 classes loaded in 1829 milliseconds

Although the debug logs shows that the ClassPathScanner is scanning the correct classes:

2016-07-21 09:35:40.099 DEBUG 68083 --- [           main] org.neo4j.ogm.scanner.ClassPathScanner   : Scanning zipFile /private/tmp/spring-data-neo4j-demo/build/libs/spring-data-neo4j-example-0.0.1-SNAPSHOT.jar
2016-07-21 09:35:40.101 DEBUG 68083 --- [           main] org.neo4j.ogm.scanner.ClassPathScanner   : Scanning class entry: BOOT-INF/classes/org/sgh/configuration/Neo4jConfig.class
2016-07-21 09:35:40.101 DEBUG 68083 --- [           main] org.neo4j.ogm.scanner.ClassPathScanner   : Scanning class entry: BOOT-INF/classes/org/sgh/Controller/ExampleController.class
2016-07-21 09:35:40.101 DEBUG 68083 --- [           main] org.neo4j.ogm.scanner.ClassPathScanner   : Scanning class entry: BOOT-INF/classes/org/sgh/persistence/ExampleRepository.class
2016-07-21 09:35:40.101 DEBUG 68083 --- [           main] org.neo4j.ogm.scanner.ClassPathScanner   : Scanning class entry: BOOT-INF/classes/org/sgh/persistence/TreeEntity.class
2016-07-21 09:35:40.101 DEBUG 68083 --- [           main] org.neo4j.ogm.scanner.ClassPathScanner   : Scanning class entry: BOOT-INF/classes/org/sgh/service/ExampleService.class
2016-07-21 09:35:40.101 DEBUG 68083 --- [           main] org.neo4j.ogm.scanner.ClassPathScanner   : Scanning class entry: BOOT-INF/classes/org/sgh/SpringDataNeo4jExampleApplication.class
2016-07-21 09:35:40.101 DEBUG 68083 --- [           main] org.neo4j.ogm.scanner.ClassPathScanner   : Scanning zipped entry: BOOT-INF/lib/spring-test-4.3.1.RELEASE.jar

I have created a minimal demo project on Github to reproduce the problem: https://github.com/sglahn/spring-data-neo4j-demo

To reproduce the problem do the following: Build the jar:

./gradlew build

Execute the jar:

java -Dspring.config.location=build/resources/main/ -jar build/libs/spring-data-neo4j-example-0.0.1-SNAPSHOT.jar

Access the Controller in the browser:

http://localhost:8765/

The log shows:

org.sgh.persistence.TreeEntity is not an instance of a persistable class

Spring Boot version is 1.4.0.RC1

Upvotes: 3

Views: 430

Answers (1)

user6396296
user6396296

Reputation: 11

Take a look at the docs for Spring Boot 1.4.0.

The method org.neo4j.ogm.metadata.DomainInfo#load scans the "basePackages" of domain and loads all the domain classes. When you use Spring Boot 1.4.0 to build the jar, the classpath of "basePackages" will change to boot-info/class/"basePackages", and then org.neo4j.ogm.scanner.ClassPathScanner#scanClassFileEntry cannot process the domain class.

So you must change to Spring boot 1.3 to resolve this problem.

Upvotes: 1

Related Questions