java - Fasterxml Jackson 数据绑定 MismatchedInputException
问题描述
我com.fasterxml.jackson.databind
在 Spring Boot 应用程序中使用。当我向端点发送请求时,我收到以下异常:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of
org.pacakge.domain.controller.Mycontroller (although at least one Creator exists): cannot
deserialize from Object value (no delegate- or property-based Creator)\n at
[Source: (PushbackInputStream); line: 2, column: 3] Is the body of the request formatted correctly?
我的控制器处理具有以下结构的请求正文:
{
"portalId": 123,
"objectType": "TYPE",
"objectTypeId": "0-3",
"objectId": 123,
"properties": { ... }
}
我需要的唯一属性是objectId
. 我已经构建了一个类来处理这个对象,如下所示:
@lombok.Value
private static class MyObject {
@JsonAlias("objectId")
private final String dealId;
}
我设计了一个看起来像这样的控制器
@Slf4j
@RestController
@RequestMapping(path = "/entrypoint")
public class MyController {
@Autowired
public MyController(){}
/**
* REST endpoint handles MyObject
*/
@PostMapping(value = "/endpoint")
public void handleRequest(
@Valid @RequestBody MyObject command
) {
log.debug(command.getDealId());
}
@lombok.Value
private static class MyObject {
@JsonAlias("objectId")
private final String dealId;
}
}
这个问题的有趣之处在于,如果我更改MyObject
为以下结构,我的请求会得到很好的处理:
@lombok.Value
private static class MyObject {
@JsonAlias("objectId")
private final String dealId;
private final JSONObject properties; // TODO we shouldn't need this. Fix.
}
我似乎无法弄清楚问题是什么。我很想在这个问题上得到一些帮助。也许有我缺少的注释?我希望其他人遇到过这个问题。我只是通过搜索网络没有找到任何关于它的信息。
解决方案
lombok.config
我在项目的根目录中添加了以下行:
lombok.anyConstructor.addConstructorProperties=true
@JsonIgnoreProperties
之后,使用注释使用此 DTO 设法反序列化您的 JSON :
@Value
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyObject {
@JsonProperty("objectId")
String dealId;
}
推荐阅读
- vba - “SELECT ... FROM ... WHERE”中的 AND 语句
- android - 在android webview中将字符串呈现为HTML
- mysql - 查找前两列的总和以及它们有多少分?
- android - 如何在 Android Studio 3.4 中创建没有互联网使用“离线组件”的 gradle 项目
- php - 用于检查会话是否存在的 isset 在 PHP 中不起作用
- react-native - 如何使用 Flatlist 导航到详细信息页面
- anaconda - Anaconda 的 theano 的 cuDNN
- python - Excel 公式重新计算不起作用
- javascript - 在 Node.js 中处理“原始数据”并在 Node Express 端点中传递数据
- unit-testing - 模拟基接口属性不能通过派生接口的模拟工作