【问题标题】:How to cast java lang long to entity class in SpringBoot application如何在 Spring Boot 应用程序中将 java lang long 转换为实体类
【发布时间】:2021-12-14 07:00:55
【问题描述】:

我创建了一个应用程序,当我去更新我的数据库中的一列时,我 得到这种类型的错误。

java.lang.ClassCastException: class com.nilmani.jobworkmanagement.entity.DepositMaterial cannot be cast to class java.lang.Long (com.nilmani.jobworkmanagement.entity.DepositMaterial is in unnamed module of loader 'app'; java.lang.Long is in module java.base of loader 'bootstrap')
    at com.sun.proxy.$Proxy93.findByUserId(Unknown Source) ~[na:na]
    at com.nilmani.jobworkmanagement.service.DepositService.updateDeposit(DepositService.kt:43) ~[main/:na]
    at com.nilmani.jobworkmanagement.controller.AdminMaterialController.updateMaterial(AdminMaterialController.kt:49) ~[main/: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:564) ~[na:na]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.12.jar:5.3.12]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[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.service(FrameworkServlet.java:880) ~[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:90) ~[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]

DepositMaterial.kt

package com.nilmani.jobworkmanagement.entity

import javax.persistence.*

@Entity
data class DepositMaterial(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "depositId")
    val id: Long = -1,
    val userId: Long = -1,
    val totalPieces: Long = -1,
    val deposit: Long = -1,
    val pending: Long = totalPieces-deposit,
    val workStatus: Boolean = false

)

ReqUpdateDeposit.kt

package com.nilmani.jobworkmanagement.model.request

data class ReqUpdateDeposit(
    val userId:Long=-1,
    val pending:Long=-1,
)

DepositService.kt

package com.nilmani.jobworkmanagement.service

import com.nilmani.jobworkmanagement.entity.DepositMaterial
import com.nilmani.jobworkmanagement.model.request.ReqDeposit
import com.nilmani.jobworkmanagement.model.request.ReqUpdateDeposit
import com.nilmani.jobworkmanagement.repository.DepositRepository
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import kotlin.jvm.Throws

@Service
class DepositService {
    @Autowired
    private lateinit var depositRepository: DepositRepository
    
    @Throws(Exception::class)
    fun updateDeposit(request : ReqUpdateDeposit):DepositMaterial{
        val existingUser = depositRepository.findByUserId(request.userId)
        if (existingUser == request.userId){
            if (request.pending.equals(0)){
                depositRepository.updateWorkStatus(true,request.userId)
            }else{
                println("you have still pending materials")
            }
        }
        else{
            println("Enter a valid userId")
        }
        return DepositMaterial()
    }

}

DepositMaterialRepository.kt

package com.nilmani.jobworkmanagement.repository

import com.nilmani.jobworkmanagement.entity.DepositMaterial
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Modifying
import org.springframework.data.jpa.repository.Query
import org.springframework.web.bind.annotation.RequestParam
import javax.transaction.Transactional

interface DepositRepository : JpaRepository<DepositMaterial, Long> {
    /** find user by userID*/
    fun findByUserId(userId: Long):Long

    @Transactional
    @Modifying
    @Query("update DepositMaterial d set d.workStatus =:workStatus where d.userId =:userId")
    fun updateWorkStatus(@RequestParam("workStatus")workStatus: Boolean,userId: Long)
}

AdminMaterialController.kt

package com.nilmani.jobworkmanagement.controller

import com.nilmani.jobworkmanagement.model.request.ReqDeposit
import com.nilmani.jobworkmanagement.model.request.ReqUpdateDeposit
import com.nilmani.jobworkmanagement.model.request.ReqWithdrawMaterial
import com.nilmani.jobworkmanagement.model.response.ResMessage
import com.nilmani.jobworkmanagement.model.response.RespDeposit
import com.nilmani.jobworkmanagement.model.response.RespWithdrawMaterial
import com.nilmani.jobworkmanagement.service.DepositService
import com.nilmani.jobworkmanagement.service.WithdrawMaterialService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*

@RestController
@RequestMapping("/admin")
class AdminMaterialController {
    @Autowired
    private lateinit var materialService: WithdrawMaterialService
    @Autowired
    private lateinit var depositService: DepositService
    
    @PatchMapping("/verifyWorkstatus")
    fun updateMaterial(@ModelAttribute request: ReqUpdateDeposit):ResponseEntity<*>{
        val updateWork = depositService.updateDeposit(request)
        return ResponseEntity(ResMessage("Update success full"),HttpStatus.OK)
    }
}

这个问题的原因是什么,没有我在哪里转换长变量 与实体类,我只是调用实体类变量 访问和更新 DepositMaterial 工作状态列

【问题讨论】:

  • 尝试将@RequestParam 注释添加到存储库中的userId 参数中。

标签: mysql spring-boot kotlin jpa


【解决方案1】:

这部分代码

val existingUser = depositRepository.findByUserId(request.userId)
if (existingUser == request.userId){

您正在将 DepositMaterial(existingUser) 对象与长对象 (request.userId) 进行比较。这是错误的。还有为什么在您已经从存储库中获得实体时需要比较它。此外,由于您将 id 定义为 Long(不是原始类型),因此您需要使用 equals。反正你可以这样比较

if (existingUser.id.equals(request.userId)){

【讨论】:

  • 这些数字应该与equals()进行比较 if (existingUser.id.equals(request.userId)) {
  • 你是对的,因为它没有被定义为原始它应该是相等的。更新了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 2017-03-11
相关资源
最近更新 更多