Spring Kotlin: поля Bean во время выполнения имеют нулевое значение, несмотря на то, что они вводятся во время создания экземпляра - PullRequest
0 голосов
/ 02 октября 2018

Я пробую поддержку Spring Kotlin и хочу получить следующий простой шаблон DAO в приложении Spring Boot (с использованием реактивных функций Spring, созданных благодаря веб-сайту Spring Initializr):

@Document
data class Person(val age: Int, val name: String)

abstract class AbstractDAO<T>(private val clazz: Class<T>, private val reactiveMongoTemplate: ReactiveMongoTemplate) {
    fun create(t: Mono<T>) = reactiveMongoTemplate.insert(t)
    fun findAll() = reactiveMongoTemplate.findAll(clazz)
}

@Repository
class GroupDAO(reactiveMongoTemplate: ReactiveMongoTemplate) : AbstractDAO<Group>(Group::class.java, reactiveMongoTemplate)

@RestController
@RequestMapping("/group")
class GroupController(val groupDao: GroupDAO) {

    @PostMapping("/create")
    fun create(@RequestBody group: Mono<Group>) = groupDao.create(group)

}

Вот соответствующая трассировка стека:

2018-10-02 10:07:51.294  INFO 19434 --- [-server-epoll-5] r.ipc.netty.tcp.BlockingNettyContext     : Started HttpServer on /0:0:0:0:0:0:0:0%0:8080
2018-10-02 10:07:51.294  INFO 19434 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port(s): 8080
2018-10-02 10:07:51.295 DEBUG 19434 --- [           main] s.b.w.r.c.StandardReactiveWebEnvironment : Adding PropertySource 'server.ports' with highest search precedence
2018-10-02 10:07:51.298  INFO 19434 --- [           main] fr.rs.reactive.ReactiveApplicationKt     : Started ReactiveApplicationKt in 7.284 seconds (JVM running for 8.072)
2018-10-02 10:08:06.655 ERROR 19434 --- [-server-epoll-7] .a.w.r.e.DefaultErrorWebExceptionHandler : Failed to handle request [POST http://localhost:8080/group/create]

java.lang.NullPointerException: null
    at fr.rs.reactive.dao.AbstractDAO.create(AbstractDAO.kt:7) ~[classes/:na]
    at fr.rs.reactive.web.GroupController.create(GroupController.kt:19) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.springframework.web.reactive.result.method.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:243) ~[spring-webflux-5.0.9.RELEASE.jar:5.0.9.RELEASE]
    at org.springframework.web.reactive.result.method.InvocableHandlerMethod.lambda$invoke$0(InvocableHandlerMethod.java:138) ~[spring-webflux-5.0.9.RELEASE.jar:5.0.9.RELEASE]

Эта строка 7 в классе AbstractDAO выглядит следующим образом:

fun create(t: Mono<T>) = reactiveMongoTemplate.insert(t)

Этот код компилируется, и мое приложение запускается и работает, но следующее поведениепроисходит, и я получаю исключение NullPointerException, когда методы insert или findAll фактически вызваны.Вот мои наблюдения:

  • Когда я ставлю точку останова на строке класса класса AbstractDAO, реактивныйMongoInstance правильно вводится -> не ноль
  • Когда я ставлю точку останова вметод, аннотированный @PostConstruct, правильно реагирует на инициализацию поля responsetiveMongoInstance
  • Экземпляр GroupDAO, создаваемый Spring, корректно внедряется, если задан в качестве параметра конструктора другого класса (например, контроллера)
  • Когда методэкземпляра GroupDAO вызывается из контроллера, возникает исключение NullPointerException: и clazz, и responsetiveMongoTemplate имеют значение null
  • В конструкторе и методе @PostConstruct экземпляр GroupDAO, показанный отладчиком, кажется «нормальным».в то время как тот, который вводится в контроллер, является расширенным Spring (CGLIB)

Есть ли у вас какие-либо идеи относительно того, почему поля расширенного экземпляра равны нулю во время выполнения, несмотря на то, что они правильно вводятся при запуске?Как вы думаете, это связано с тем, что мое приложение «реактивное»?Или это связано с Kotlin?У меня не было проблем с реализацией этого шаблона в неактивном приложении Spring, основанном на загрузке Java.

Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...