org.springframework.core.convert.converter.Converter <S, T> выдает ошибку: Null не может быть значением ненулевого типа - PullRequest
2 голосов
/ 09 мая 2019

Я пытаюсь реализовать 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?

1 Ответ

1 голос
/ 09 мая 2019

Я не думаю, что то, что вы пытаетесь сделать, действительно.Если вы посмотрите на Converter.convert JavaDocs, то увидите, что аргумент source в функции convert имеет следующее:

@ param source исходный объект для преобразования, который должен бытьэкземпляр {@code S} ( never {@code null} )

Так что явно говорится, что вы никогда не сможете передать null в функцию convert.

И наоборот, то, что возвращает функция convert, может быть нулевым:

@ возвращает преобразованный объект, который должен быть экземпляром {@code T} ( потенциально {@code null} )

Метод convert в коде Java аннотирован с помощью @Nullable, а JavaDocs для этого говорит:

..Используется Kotlin для вывода обнуляемости Spring API.

Так вот, как Kotlin решает, может ли параметр быть нулевым (в этом случае параметр не может, но возвращаемое значение может).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...