【问题标题】:Assignments are not expressions, and only expressions are allowed in this context kotllin error赋值不是表达式,在这个上下文中只允许表达式 kotllin 错误
【发布时间】:2021-11-29 22:33:36
【问题描述】:

我想创建用户注册服务,将数据存储在mongodb但是 当我在用户构建函数中传递所有必需的数据时,我得到了一些 像作业这样的问题不是表达式,只有表达式是 在构建器函数中允许在此上下文中,但我不确定如何 在 Mongodb 中存储用户提供数据,这是我的代码模式 注册用户但它不工作它会抛出如下错误类型

Assignments are not expressions, and only expressions are allowed in this context



@PostMapping(value = ["/users"], produces = [MediaType.APPLICATION_JSON_VALUE])
    fun createUser(@RequestBody payload: Signup): ResponseEntity<*>? {
        log.info("creating user {}", payload.username)
        val user: User = User
            .builder()
            .username= payload.username
            .email=payload.email
            .password=payload.password
            .userProfile(
                Profile
                    .builder()
                    .displayName=payload.name
                    .profilePictureUrl=payload.profilePicUrl
                    .build()
            )
            .build()
        try {
            userService.registerUser(user, Role.USER)
        } catch (e: UserNameAlreadyExistException) {
            throw BadRequestException(e.message)
        } catch (e: EmailAlreadyExistException) {
            throw BadRequestException(e.message)
        }
        val location = ServletUriComponentsBuilder
            .fromCurrentContextPath().path("/users/{username}")
            .buildAndExpand(user.userName).toUri()
        return ResponseEntity
            .created(location)
            .body(ApiResponse(true, "User registered successfully"))
    }

userService 中不支持builder 函数。我不明白 要导入哪种类型的构建器函数。在建议中它显示很多 导入建议。我使用 MongoDb 作为数据库,使用 springboot 作为 框架工作

【问题讨论】:

  • 下面的答案有帮助吗?

标签: spring-boot kotlin


【解决方案1】:
User
  .builder()
  .username= payload.username
  .email=payload.email

这是不正确的语法,您不能进行赋值并在以后使用点运算符访问下一个变量。

以下是 Kotlin 中的一些替代方案

kotlin 中的 setter 方法可以使用属性访问语法。您可以用实际的 setter 方法替换属性访问语法。 Builder 中的每个 setter 方法都返回 Builder 的当前实例,因此您可以在一行中链接多个 setter

 User
    .builder()
    .setUsername(payload.username)
    .setEmail(payload.email).build()

使用also 函数设置多个变量。传递给 also 函数的 lambda 将获取 Builder 实例并使用属性访问语法使用 setter 方法

User.builder().apply{
   username = payload.username
   email = payload.email
}.build()

为了更好理解,将语句分成多行

 var userBuilder = User.Builder()
 userBuilder = userBuilder.setUsername(payload.username)
 userBuilder = userBuilder.setEmail(payload.email)

 val user = userBuilder.build()

【讨论】:

  • 我认为apply() 用于这种初始化,而不是also()。 (一方面,它省去了it.。)
猜你喜欢
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多