java - “@RequiredArgsConstructor”和“MismatchedInputException:无法构造实例”
问题描述
我有多个 DTO 对象,它们看起来都像这样:
@Getter
@RequiredArgsConstructor
public class SomeDTO {
private final String someProperty;
}
这些 DTO 对象以各种RestController
方法接受:
@RestController
public void InvitationController {
@PostMapping
public String create(@RequestBody InvitationCreationDTO invitationCreationDTO) {
// some logic
return "ok";
}
}
Jackson 将 json 反序列化为这些类没有问题,除了以下一个:
@Getter
@RequiredArgsConstructor
public class InvitationCreationDTO {
private final String emailAddress;
}
当 Jackson 尝试反序列化以下 JSON 时:
{ "emailAddress" : "some@email.com" }
抛出此错误:
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `my.package.InvitationCreationDTO` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (PushbackInputStream); line: 1, column: 2]
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1429) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1059) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1297) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3258) ~[jackson-databind-2.10.2.jar:2.10.2]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:239) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE]
... 86 common frames omitted
但是,当我自己删除@RequiredArgsConstructor
并创建一个时,它可以工作:
@Getter
public class InvitationCreationDTO {
private final String emailAddress;
@JsonCreator
public InvitationCreationDTO(String emailAddress) {
this.emailAddress = emailAddress;
}
}
为什么这个类需要这个,但我的其他 DTO 类(具有相同格式)却不需要?
解决方案
尝试添加@NoArgsConstructor
到您的InvitationCreationDTO
班级
@Getter
@NoArgsConstructor
@RequiredArgsConstructor
public class InvitationCreationDTO {
private final String emailAddress;
}
推荐阅读
- r - 有没有办法处理涉及 R 中大值指数的计算?
- javascript - 在 React-ace 中设置值时出现类型错误
- python - 在 pandas 列中出现许多不同的事件
- vb.net - 随机数生成器重复输出值
- couchbase - CbBackup 工具在集群中的特定存储桶不活动 30 秒后被中断
- css - IE11 不应用媒体查询
- node.js - 为什么我的 Nightwatch.js 测试无法连接到 CircleCI 上的 localhost 端口 9515 而不是在本地成功运行?
- javascript - 如何将此 if 语句转换为三元(javascript)
- pandas - 如何调用函数并创建新函数
- visual-studio - VS 不调试当前源文件