В настоящее время мы пробуем наше первое приложение dropwizard в Котлине. Все отлично работает, кроме аннотации UnitOfWork.
У нас есть следующая маленькая конечная точка, которая прекрасно работает, если вы вызываете ее с простым ApiClient, как Postman:
@GET
@Produces(MediaType.APPLICATION_JSON)
@Timed
@UnitOfWork
fun getAttributes(@Auth user: User): CoreAttributes {
return CoreAttributes(userDao.getUser(user.id) ?: throw NotFoundException())
}
Проблема здесь заключается в userDAO.getUser (user.id), когда мы вызываем Ресурс с WebTarget в UnitTest. DAO выглядит так:
open class UserDAO @Inject constructor(sessionFactory: SessionFactory): AbstractDAO<UserData>(sessionFactory) {
fun getUser(id: Long): UserData? {
return get(id)
}
}
Итак, в getUser (id: Long) вызывается метод get AbstractDAO в io.dropwizard.hibernate. Вот в основном эта функция:
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-фреймворках или библиотеках, но я не уверен, имеет ли место отражение здесь.
Заранее спасибо!