【问题标题】:Parameter specified as non-null is null in Kotlin指定为非空的参数在 Kotlin 中为空
【发布时间】:2021-12-09 16:10:06
【问题描述】:

我创建了一个 UserWork Entity 类,它包含 5 个元素,共 5 个 2 元素是枚举类型。但是当我尝试访问该实体类时 插入它的时间在我的枚举上抛出了一个空指针异常 数据。获取低于类型的错误

java.lang.NullPointerException: Parameter specified as non-null is null: method com.nilmani.workmanagement.model.request.ReqWork.<init>, parameter fIxWork
    at com.nilmani.workmanagement.model.request.ReqWork.<init>(ReqWork.kt) ~[main/:na]
    at com.nilmani.workmanagement.model.request.ReqWork.<init>(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]

用户工作.kt

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):ResponseEntity<*>{
        val newWork = workService.addWork(request)
        val respWork = RespWork(
            newWork.userId,
            newWork.materialType,
            newWork.fIxWork,
        )
        return ResponseEntity(respWork,HttpStatus.OK)
    }
}

我在服务类中得到空指针错误。什么是默认值 枚举类型的值

【问题讨论】:

    标签: spring-boot kotlin


    【解决方案1】:

    发生崩溃是因为 val fIxWork 被声明为非空类型 FIxWork 而不是空类型 FIxWork?

    请检查为什么UserWorkService 从方法中返回nullfIxWork

    fun addWork(request:ReqWork):UserWork
    

    如果上面提到的方法fIxWork得到null是正常的,那么请将变量的声明修改为

    val fIxWork: FIxWork?
    

    【讨论】:

      【解决方案2】:

      您提供的堆栈跟踪显示该异常实际上并未发生在服务类中,而是在尝试调用您的控制器时出现在 Spring 的机器中。

      AdminWorkController.addWorkrequest: ReqWork 作为输入,因此 spring 必须将请求数据映射到 ReqWork 实例中,这就是失败的原因。

      失败意味着您的请求不包含fIxWork 的值,因此您应该检查/add 端点的调用者。表单数据很可能不包含 fIxWork 的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-06
        • 2019-11-19
        • 2017-12-06
        • 1970-01-01
        • 2019-06-03
        • 2017-11-20
        相关资源
        最近更新 更多