我们目前正在Kotlin中尝试我们的第一个dropwizard应用程序。除UnitOfWork注释外,其他一切正常。
如果您使用像Postman这样的简单ApiClient调用它,我们的以下小端点就可以很好地工作:
@GET
@Produces(MediaType.APPLICATION_JSON)
@Timed
@UnitOfWork
fun getAttributes(@Auth user: User): CoreAttributes {
return CoreAttributes(userDao.getUser(user.id) ?: throw NotFoundException())
}
当我们在UnitTest中使用WebTarget调用资源时,这里的问题是userDAO.getUser(user.id)。 DAO看起来像这样:
open class UserDAO @Inject constructor(sessionFactory: SessionFactory): AbstractDAO<UserData>(sessionFactory) {
fun getUser(id: Long): UserData? {
return get(id)
}
}
因此在getUser(id:Long)中,将调用io.dropwizard.hibernate中AbstractDAO的get方法。基本上就是这个功能:
protected E get(Serializable id) {
return (E) currentSession().get(entityClass, requireNonNull(id));
}
问题是currentSession()抛出org.hibernate.HibernateException:当前没有会话绑定到执行上下文 我们在单元测试中将端点称为:
val webTarget: WebTarget = target("the-endpoint-url").request().get()
使用api客户端调用端点即可。但是在我们的单元测试中像这样调用端点是行不通的。我们在Java服务中做了同样的事情,在Java中,它工作得很好。
对此有何想法?我读到一些内容,说Kotlin可能在java框架或库中进行反思操作时遇到问题,但我不确定反射是否在这里。
谢谢!