【问题标题】:No value passed for parameter没有为参数传递值
【发布时间】:2021-05-25 07:56:00
【问题描述】:

我使用 kotli。我根据要求定义一切,为什么我得到 问题的事物类型

UserRegistrationService.kt: (25, 36): No value passed for parameter 'userRegistration'

我在我的 UserRegistration 课程中遇到了此类问题 未传递任何值 对于参数部门和用户注册

我创建 ResponseTemplateVO POJO 类 响应VO.kt

包 com.userservice.userregistration.VO

import com.userservice.userregistration.entity.UserRegistration

data class ResponseTemplateVO(
    var userRegistration: UserRegistration,
    var department: Department
)

部门.kt

package com.userservice.userregistration.VO

data class Department(
    val departmentId:Long=-1,
    val departmentName:String="",
    val departmentAddress:String="",
    val departmentCode:String=""
)

UserRegistration.kt

package com.userservice.userregistration.entity
data class UserRegistration(
    val userId:Long=-1,
    val firstName:String="",
    val lastName:String="",
    val email:String="",
    val departmentId:Long=-1,
)

UserRegistrationService.kt

package com.userservice.userregistration.service

import com.userservice.userregistration.VO.Department
import com.userservice.userregistration.VO.ResponseTemplateVO
import com.userservice.userregistration.entity.UserRegistration
import com.userservice.userregistration.repository.UserRegistrationRepository
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import org.springframework.web.client.RestTemplate


@Service
class UserRegistrationService {

    @Autowired
    private lateinit var userRegistrationRepository: UserRegistrationRepository
    @Autowired
    private lateinit var restTemplate: RestTemplate

    fun saveUserDetails(userRegistration: UserRegistration): UserRegistration {
         return userRegistrationRepository.save(userRegistration)
    }

    fun getUserWithDepartment(userId: Long): ResponseTemplateVO {
        val vo= ResponseTemplateVO()
        val userRegistration:UserRegistration=userRegistrationRepository.findUserById(userId)
        val department: Department? =
            restTemplate.getForObject("http://localhost:9001/departments/"+userRegistration.departmentId,
            Department::class.java)
        vo.userRegistration=userRegistration
        if (department != null) {
            vo.department=department
        }
        return vo

    }
}

我在第 2 行的以下方法中遇到错误

val vo= ResponseTemplateVO()

没有为参数部门和用户注册传递值。这是 错误

fun getUserWithDepartment(userId: Long): ResponseTemplateVO {
        val vo= ResponseTemplateVO()
        val userRegistration:UserRegistration=userRegistrationRepository.findUserById(userId)
        val department: Department? =
            restTemplate.getForObject("http://localhost:9001/departments/"+userRegistration.departmentId,
            Department::class.java)
        vo.userRegistration=userRegistration
        if (department != null) {
            vo.department=department
        }
        return vo

    }

【问题讨论】:

    标签: spring-boot kotlin


    【解决方案1】:

    此声明:

    data class ResponseTemplateVO(
        var userRegistration: UserRegistration,
        var department: Department
    )
    

    打包多个东西:

    • 它声明了2个属性userRegistrationdepartment
    • 它用 2 个参数定义了类的主构造函数:userRegistrationdepartment

    当你写作时:

    val vo = ResponseTemplateVO()
    

    您正在调用该类的构造函数,但您没有指定 2 个必需的参数。你应该通过传递参数来调用它:

    fun getUserWithDepartment(userId: Long): ResponseTemplateVO {
        val userRegistration:UserRegistration=userRegistrationRepository.findUserById(userId)
        val department: Department? = restTemplate.getForObject("http://localhost:9001/departments/"+userRegistration.departmentId,
                Department::class.java)
        if (department == null) {
            // here you should decide if it should have a default value
            // or throw an exception
        }
        return ResponseTemplateVO(userRegistration, department)
    }
    

    请注意,您将department 属性声明为非空,因此您需要一个非空部门才能创建类的实例。 因此,如果 department 为 null,您有 3 个选项:

    1. 抛出异常
    2. 改用默认值
    3. ResponseTemplateVO 中更改department 的类型,使其接受空值(Department??

    另外,如果你用所有需要的值实例化你的类,并且你以后不需要修改它的属性,这些属性可以声明为val。这通常是更惯用的 Kotlin。有了不变性,就更​​容易推理这些值。

    【讨论】:

      【解决方案2】:

      问题出在数据类中。

      data class ResponseTemplateVO(
          var userRegistration: UserRegistration,
          var department: Department
      )
      

      在这里,您已将以下参数添加到数据类的构造函数中。因此,您需要先将值传递给类的构造函数,然后才能对其进行初始化。

      因此您的 ResponseTemplateVO 数据类将变成这样

      data class ResponseTemplateVO(
          var userRegistration: UserRegistration?=null,
          var department: Department?=null)
      

      现在,因为我们已经指定了 null 作为默认值。现在您可以初始化数据类,它会创建值设置为 null 的数据类,您不需要将任何参数值传递给构造函数。现在您可以访问每个变量并将相应的数据设置到其中。

      【讨论】:

      • 这真的不是我首先建议的方法。应尽可能避免使事物可以为空。特别是,userRegistration 在这种情况下不必为空。通常使用 val 也比 var 更受欢迎,因为它允许智能转换等,所以这也有利于直接使用 args 调用构造函数,而不是创建一个空对象并稍后填充它。
      猜你喜欢
      • 2011-02-20
      • 2020-06-08
      • 2018-07-11
      • 2017-07-10
      • 2021-01-28
      • 1970-01-01
      • 2022-06-11
      • 2021-12-20
      • 1970-01-01
      相关资源
      最近更新 更多