1

I have Guice for DI. I can inject my repository in the controller (constructor injection):

@ImplementedBy(JPAMyEntityRepository.class)
public interface MyEntityRepository extends EntityRepository<MyEntity> {

}

@Singleton
public class JPAMyEntityRepository implements MyEntityRepository {
.....
}

public class MyEntityController extends BaseController {

    private MyEntityRepository myEntityRepository;

    @Inject
    public MyEntityController(MyEntityRepository myEntityRepo) {
        this.myEntityRepository = myEntityRepo; //OK, repo is not null
    }
}

But I can't inject the same repository in my entity listener using constructor, I have an exception (there aren't default constructor):

@MappedSuperclass
@EntityListeners(MyEntityListener.class)
public abstract class MyEntity extends OwnedEntity implements Comparable<MyEntity> {
    ....
}

public class MyEntityListener {

    private MyEntityRepository myEntityRepository;

    @Inject
    public MyEntityListener(MyEntityRepository myEntityRepo){
        this.myEntityRepository = myEntityRepo; 
    }
}

Exception:

....
Caused by: javax.persistence.PersistenceException: Unable to create instance of models.listeners.MyEntityListener as a JPA callback listener
....
Caused by: java.lang.NoSuchMethodException: models.listeners.MyEntityListener.<init>()

And when i try to inject my repo in such approach:

public class MyEntityListener {

    @Inject
    private MyEntityRepository myEntityRepository; // null
}

I have a null.

Build.sbt file:

import MetamodelGenerator.generateMetamodels

name := """my-app"""

version := "1.2.4-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayJava).settings(sourceGenerators in Compile += generateMetamodels(Seq("models")).taskValue)

scalaVersion := "2.12.2"

libraryDependencies ++= Dependencies.projectDependencies

application.conf file:

# JDBC
db {
    default {
        driver = org.postgresql.Driver
        url = "jdbc:postgresql://localhost:5432/my-app"
        schema = myapp
        username = "user"
        password = "user"
        jndiName = DefaultDS
        logSql = false

        hikaricp {
            connectionTestQuery = SELECT 1
            minimumIdle = 20
            maximumPoolSize = 40
        }
    }
}
# Point JPA at our database configuration
jpa.default = defaultPersistenceUnit

# Job queue sized to HikariCP connection pool
database.dispatcher {
    executor = "thread-pool-executor"
    throughput = 1
    thread-pool-executor {
        fixed-pool-size = 40
    }
}
Kiril Mytsykov
  • 659
  • 2
  • 10
  • 21

0 Answers0