如何通过Kotlin Data类使用默认值以及Micronaut自省验证?

问题描述

我开始学习Kotlin和Micronaut,并尝试使用Rest API构建基本的CRUD应用程序,但是我在使Bean验证与数据类一起使用方面遇到麻烦。现在我有

Task.kt

import io.micronaut.core.annotation.Introspected
import javax.validation.constraints.NotBlank

@Introspected
data class Task(
    val id: Int,@field:NotBlank val name: String,val description: String = "",val status: TaskStatus = TaskStatus.NOT_STARTED
)

TaskController.kt

@Controller("/task")
open class TaskController(private val taskRepository: TaskRepository) {

    @Post("/")
    open fun createTask(@Valid @Body task: Task): Task {
        return taskRepository.insert(task)
    }
}

Test.kt

@MicronautTest
class TaskListTest {

    @Inject
    @field:Client("/task")
    lateinit var client: RxHttpClient

    // Passes as expected
    @Test
    fun `basic insert`() {
        val request = HttpRequest.POST<Any>("/",object {
            val name = "foo"
            val description = "foo description"
            val status = TaskStatus.IN_PROGRESS
        })

        val response: Task = client.toBlocking().retrieve(request,Task::class.java)

        Assertions.assertEquals(response,Task(id=1,name="foo",description = "foo description",status = TaskStatus.IN_PROGRESS))
    }

    @Test
    fun `returns 400 if name is blank`() {
        val request = HttpRequest.POST<Any>("/",object {
            val name = ""
            val description = "foo description"
            val status = TaskStatus.IN_PROGRESS
        })

        Assertions.assertThrows(HttpClientResponseException::class.java) {
            client.toBlocking().retrieve(request,Task::class.java)
        }
    }

    // Fails but should pass
    @Test
    fun `adds default values if optional fields are not provided`() {
        val request = HttpRequest.POST<Any>("/",object {
            val name = "foo"
        })

        val response: Task = client.toBlocking().retrieve(request,status = TaskStatus.NOT_STARTED))
    }

}

我不确定如果没有提供descriptionstatus字段,为什么会返回400。它应该只使用数据类中定义的认值,对吗?而且,由于在这些字段上没有指定其他验证,因此它应该可以正常工作。

有什么想法我想念的吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)