Параметр, указанный как ненулевой, в Kotlin равен нулю

#spring-boot #kotlin

Вопрос:

Я создаю класс сущности UserWork, он содержит 5 элементов, из пяти 2 элемента имеют тип перечисления. но когда я пытаюсь получить доступ к этому классу сущностей во время вставки, он выдает исключение с нулевым указателем для моих данных перечисления. Получить ниже тип ошибки

 java.lang.NullPointerException: Parameter specified as non-null is null: method com.nilmani.workmanagement.model.request.ReqWork.lt;initgt;, parameter fIxWork  at com.nilmani.workmanagement.model.request.ReqWork.lt;initgt;(ReqWork.kt) ~[main/:na]  at com.nilmani.workmanagement.model.request.ReqWork.lt;initgt;(ReqWork.kt:10) ~[main/:na]  at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]  at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:na]  at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]  at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) ~[na:na]  at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481) ~[na:na]  at kotlin.reflect.jvm.internal.calls.CallerImpl$Constructor.call(CallerImpl.kt:41) ~[kotlin-reflect-1.5.31.jar:1.5.31-release-548(1.5.31)]  at kotlin.reflect.jvm.internal.KCallableImpl.callDefaultMethod$kotlin_reflection(KCallableImpl.kt:173) ~[kotlin-reflect-1.5.31.jar:1.5.31-release-548(1.5.31)]  at kotlin.reflect.jvm.internal.KCallableImpl.callBy(KCallableImpl.kt:112) ~[kotlin-reflect-1.5.31.jar:1.5.31-release-548(1.5.31)]  at org.springframework.beans.BeanUtils$KotlinDelegate.instantiateClass(BeanUtils.java:867) ~[spring-beans-5.3.12.jar:5.3.12]  at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:196) ~[spring-beans-5.3.12.jar:5.3.12]  at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.constructAttribute(ModelAttributeMethodProcessor.java:332) ~[spring-web-5.3.12.jar:5.3.12]  at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:220) ~[spring-web-5.3.12.jar:5.3.12]  at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:85) ~[spring-webmvc-5.3.12.jar:5.3.12]  at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:147) ~[spring-web-5.3.12.jar:5.3.12]  at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.12.jar:5.3.12]  at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:179) ~[spring-web-5.3.12.jar:5.3.12]  at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:146) ~[spring-web-5.3.12.jar:5.3.12]  at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.12.jar:5.3.12]  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.12.jar:5.3.12]  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.12.jar:5.3.12]  at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.12.jar:5.3.12]  at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) ~[spring-webmvc-5.3.12.jar:5.3.12]  at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.12.jar:5.3.12]  at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.12.jar:5.3.12]  at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.12.jar:5.3.12]  at javax.servlet.http.HttpServlet.service(HttpServlet.java:681) ~[tomcat-embed-core-9.0.54.jar:4.0.FR]  at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.12.jar:5.3.12]  at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.54.jar:4.0.FR]  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.54.jar:9.0.54]  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.12.jar:5.3.12]  at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.12.jar:5.3.12]  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.12.jar:5.3.12]  at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.12.jar:5.3.12]  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.12.jar:5.3.12]  at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.12.jar:5.3.12]  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.54.jar:9.0.54]  at java.base/java.lang.Thread.run(Thread.java:832) ~[na:na]  

Пользовательская работа.кт

 package com.nilmani.workmanagement.entity  import com.nilmani.workmanagement.enum.FIxWork import com.nilmani.workmanagement.enum.MaterialType import java.time.LocalDate import java.time.LocalDateTime import javax.persistence.*  @Entity data class UserWork(  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  val id:Long=-1, // @OneToOne(mappedBy = "userWork") // val user: User,  val userId:Long=-1,  @Enumerated(EnumType.STRING)  @Column(nullable = false)  val materialType: MaterialType,  @Enumerated(EnumType.STRING)  @Column(nullable = false)  val fIxWork: FIxWork,  val pieces:Int=0,  val workDate:LocalDateTime= LocalDateTime.now() )  

ReqWork.kt

 package com.nilmani.workmanagement.model.request  import com.nilmani.workmanagement.enum.FIxWork import com.nilmani.workmanagement.enum.MaterialType import java.time.LocalDateTime import javax.persistence.Column import javax.persistence.EnumType import javax.persistence.Enumerated  data class ReqWork (  val userId:Long=-1,  @Enumerated(EnumType.STRING)  @Column(nullable = false)  val materialType: MaterialType,  @Enumerated(EnumType.STRING)  @Column(nullable = false)  val fIxWork: FIxWork ,  val pieces:Int=0,  val workDate: LocalDateTime = LocalDateTime.now(),  )  

UserWorkService.kt

 package com.nilmani.workmanagement.service  import com.nilmani.workmanagement.entity.UserWork import com.nilmani.workmanagement.model.request.ReqWork import com.nilmani.workmanagement.repository.UserWorkRepository import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service import java.time.LocalDateTime  @Service class UserWorkService {  @Autowired  private lateinit var userWorkRepository: UserWorkRepository   fun addWork(request:ReqWork):UserWork{  val newWork = UserWork(  userId = request.userId,  materialType = request.materialType,  fIxWork = request.fIxWork,  pieces = request.pieces,  workDate = LocalDateTime.now(),  )  return userWorkRepository.save(newWork)  } }  

AdminWorkController.kt

 package com.nilmani.workmanagement.controller  import com.nilmani.workmanagement.entity.UserWork import com.nilmani.workmanagement.model.request.ReqWork import com.nilmani.workmanagement.model.response.RespWork import com.nilmani.workmanagement.service.UserWorkService import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.ModelAttribute import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController  @RestController @RequestMapping("/work") class AdminWorkController {  @Autowired  private lateinit var workService: UserWorkService  @PostMapping("/add")  fun addWork(@ModelAttribute request:ReqWork):ResponseEntitylt;*gt;{  val newWork = workService.addWork(request)  val respWork = RespWork(  newWork.userId,  newWork.materialType,  newWork.fIxWork,  )  return ResponseEntity(respWork,HttpStatus.OK)  } }  

Я получаю ошибку нулевого указателя в классе обслуживания . Каково значение по умолчанию для типа перечисления

Ответ №1:

Предоставленная вами трассировка стека показывает, что исключение на самом деле возникает не в классе обслуживания, а в механизме Spring при попытке вызвать ваш контроллер.

AdminWorkController.addWork принимает a request: ReqWork в качестве входных данных, поэтому spring должен сопоставить данные запроса с ReqWork экземпляром, и это приводит к сбою.

Ошибка означает , что ваш запрос не содержит значения для fIxWork , поэтому вам следует проверить вызывающую /add конечную точку. Скорее всего, данные формы не содержат значения для fIxWork .

Ответ №2:

сбой происходит из val fIxWork -за того, что объявлен ненулевой тип FIxWork вместо нулевого типа FIxWork?

Пожалуйста, проверьте, почему UserWorkService возвращается null для fIxWork метода from

 fun addWork(request:ReqWork):UserWork  

Если это нормально, чтобы получить значение null для fIxWork вышеупомянутого метода, то, пожалуйста, исправьте объявление переменной как

 val fIxWork: FIxWork?