簡體   English   中英

賦值不是表達式,在這個上下文中只允許表達式 kotllin 錯誤

[英]Assignments are not expressions, and only expressions are allowed in this context kotllin error

我想創建用戶注冊服務,將數據存儲在 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 函數。我不明白要導入哪種類型的 Builder 函數。 在建議中它顯示了很多導入建議。我使用 MongoDb 作為數據庫,使用 springboot 作為框架

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM