Spring boot 没有为参数传递值

Spring boot 没有为参数传递值,spring-boot,kotlin,Spring Boot,Kotlin,我用kotli。我根据需求定义一切,为什么我会 事物类型问题 我在UserRegistration类中遇到了这种类型的问题没有传递值 用于参数部门和用户注册 我创建了ResponseTemplateVOPOJO类 ResponseVO.kt 包com.userservice.userregistration.VO import com.userservice.userregistration.entity.UserRegistration data class ResponseTemplate

我用kotli。我根据需求定义一切,为什么我会 事物类型问题

我在UserRegistration类中遇到了这种类型的问题没有传递值 用于参数部门和用户注册

我创建了ResponseTemplateVOPOJO类 ResponseVO.kt

包com.userservice.userregistration.VO

import com.userservice.userregistration.entity.UserRegistration

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

UserRegistration.kt

UserRegistrationService.kt

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

没有为参数department和userRegistration传递值。这是 错误

本声明:

数据类ResponseTemplateVO(
var userRegistration:userRegistration,
var部门:部门
)
包装多种物品:

  • 它声明了两个属性
    userRegistration
    department
  • 它用两个参数定义类的主构造函数:
    userRegistration
    department
当你写作时:

val vo=ResponseTemplateVO()
您正在调用该类的构造函数,但未指定2个必需参数。您应该通过传递参数来调用它:

fun getUserWithDepartment(userId:Long):ResponseTemplateVO{
val userRegistration:userRegistration=userRegistrationRepository.findUserById(userId)
val部门:部门?=restTemplate.getForObject(“http://localhost:9001/departments/“+userRegistration.departmentId,
Department::class.java)
如果(部门==null){
//在这里,您应该决定它是否应该有一个默认值
//或者抛出异常
}
返回响应模板VO(用户注册,部门)
}
请注意,您将
部门
属性声明为非空,因此需要非空部门才能创建类的实例。 因此,如果
部门
为空,则有3个选项:

  • 抛出异常
  • 改用默认值
  • 更改
    ResponseTemplateVO
    部门的类型,使其接受空值(
    部门?

  • 此外,如果您使用所有必需的值实例化类,并且以后不需要修改其属性,则可以声明属性
    val
    。这通常是更惯用的科特林。使用不变性,更容易对值进行推理。

    问题在于数据类

    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调用构造函数,而不是创建空对象并在以后填充。嘿,感谢您提供的信息。
    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,
    )
    
    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
    
        }
    }
    
    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
    
        }
    
    data class ResponseTemplateVO(
        var userRegistration: UserRegistration,
        var department: Department
    )
    
    data class ResponseTemplateVO(
        var userRegistration: UserRegistration?=null,
        var department: Department?=null)