gpt4 book ai didi

spring - org.springframework.core.convert.converter.Converter 给出错误 : Null can not be a value of a non-null type

转载 作者:行者123 更新时间:2023-12-02 12:47:12 31 4
gpt4 key购买 nike

我尝试实现 Spring Converter,但在单元测试中出现错误:

Kotlin: Null can not be a value of a non-null type TodoItem

如果我尝试更改转换方法签名
override fun convert(source: TodoItem): GetTodoItemDto?


override fun convert(source: TodoItem?): GetTodoItemDto?

将 null 传递给方法我还有其他错误:
Error:(10, 1) Kotlin: Class 'TodoItemToGetTodoItemDto' is not abstract and does not implement abstract member @Nullable public abstract fun convert(p0: TodoItem): GetTodoItemDto? defined in org.springframework.core.convert.converter.Converter
Error:(14, 5) Kotlin: 'convert' overrides nothing

代码示例:

TodoItemToGetTodoItemDto.kt
package com.example.todo.converters

import com.example.todo.dtos.todo.GetTodoItemDto
import com.example.todo.model.TodoItem
import org.springframework.core.convert.converter.Converter
import org.springframework.lang.Nullable
import org.springframework.stereotype.Component

@Component
class TodoItemToGetTodoItemDto : Converter<TodoItem?, GetTodoItemDto> {

@Nullable
@Synchronized
override fun convert(source: TodoItem): GetTodoItemDto? {
if(source == null){
return null
}

return GetTodoItemDto(source.id, source.name, source.isComplete)
}

}

TodoItemToGetTodoItemDtoTest.kt
package com.example.todo.converters

import org.junit.Before
import org.junit.Test

import org.junit.Assert.*


class TodoItemToGetTodoItemDtoTest {
private lateinit var conveter : TodoItemToGetTodoItemDto

@Before
fun setUp() {
conveter = TodoItemToGetTodoItemDto()
}

@Test
fun testNullObject(){
assertNull(conveter.convert(null))
}

}

GetTodoItemDto.kt
package com.example.todo.dtos.todo

data class GetTodoItemDto(val id: Long, val name: String, val isComplete: Boolean)

TodoItem.kt
package com.example.todo.model

import com.fasterxml.jackson.annotation.JsonCreator
import com.fasterxml.jackson.annotation.JsonProperty
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.Id

@Entity
data class TodoItem @JsonCreator constructor(
@Id
@GeneratedValue
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
var id: Long,
var name: String,
var isComplete: Boolean){
constructor(): this(0, "", false)
constructor(name:String) : this(0, name, false)
}

你能向我解释一下如何使用 Kotlin 来实现吗?可能是我使用 Kotlin 做错了什么?

最佳答案

我不认为你试图做的是有效的。如果你看 Converter.convert JavaDocs 你会看到 source参数进入convert函数有这个:

@param source the source object to convert, which must be an instance of {@code S} (never {@code null})



所以它明确说你永远不能通过 nullconvert功能。

相反,什么 convert函数返回可以为空:

@return the converted object, which must be an instance of {@code T} (potentially {@code null})


convert Java代码中的方法用 @Nullable注解和 JavaDocs 上说:

...used by Kotlin to infer nullability of Spring API.



所以这就是 Kotlin 决定参数是否可以为 null 的方式(在这种情况下参数不能,但返回值可以)。

关于spring - org.springframework.core.convert.converter.Converter<S, T> 给出错误 : Null can not be a value of a non-null type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56055259/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com