我有一个这样的 DTO 对象:
data class ClientDto(
var uuid: String,
var ip: String,
var lastSeen: Date? = Date()
) {
internal fun toEntity() = Client(uuid=uuid, ip=ip, lastSeen=Date())
}
...和这样的 Controller :
@RestController
internal class ClientController {
@Autowired
private lateinit var service : ClientService
@GetMapping("/clients")
internal fun getClients() = service.findAll()
@PostMapping("/clients")
internal fun postClient(@RequestBody client: ClientDto) = service.add(client)
}
现在我用 httpie 发布这样的东西:
http POST localhost:8080/clients uuid=my-uuid ip=192.123.31:8080
并得到:
{
"error": "Bad Request",
"exception": "org.springframework.http.converter.HttpMessageNotReadableException",
"message": "JSON parse error: Can not construct instance of awesome.discovery.domain.dto.ClientDto: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of awesome.discovery.domain.dto.ClientDto: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)\n at [Source: java.io.PushbackInputStream@71c6ae97; line: 1, column: 2]",
"path": "/clients",
"status": 400,
"timestamp": 1519587678605
}
- 这篇文章有什么问题?
- 更重要的是我该如何调试它,例如知道它尝试了什么以及如何了解它哪里出了问题?
最佳答案
1- 您的 DTO 需要提供一个默认构造函数(没有参数的空构造函数)。这就是错误所说的
2- Spring 根据RequestParam
的类型配置Jackson 使用反射自动反序列化JSON。您可以自定义此行为实现 JsonDeserializer
。如果你想调试,你可以在用 PostMapping
关于spring - 如何调试 HttpMessageNotReadableException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48978072/