问题描述
我开始学习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))
}
}
我不确定如果没有提供description
或status
字段,为什么会返回400。它应该只使用数据类中定义的默认值,对吗?而且,由于在这些字段上没有指定其他验证,因此它应该可以正常工作。
有什么想法我想念的吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)