【发布时间】:2022-11-20 23:20:21
【问题描述】:
背景
- 我想克隆存储 Spring Boot 请求值的 DTO。
- 有时它有一个不可序列化的字段(即
MultipartFile),所以我不能像https://stackoverflow.com/a/64066/3902663那样使用ObjectOutputStream/ObjectInputStream的策略。
- 有时它有一个不可序列化的字段(即
- 我无法控制这些 DTO,因此无法添加
transient修饰符来忽略这些字段。
我试过的
我试着用 Jackson 的 ObjectMapper 写了一个方法。您可以使用 @JsonIgnoreType 和 ObjectMapper#addMixIn() 根据它们的类忽略不可序列化的字段,而无需更改 DTO 的定义。
private Object makeClone(Object obj) {
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(MultipartFile.class, JacksonMixInForIgnoreType.class);
try {
return mapper.readValue(mapper.writeValueAsString(obj), obj.getClass());
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
@JsonIgnoreType
class JacksonMixInForIgnoreType {}
问题
你不能用这个策略忽略像MultipartFile[] fileArray;这样的字段。当你在 DTO 中有一个 MultipartFile 数组来上传多个文件时,上面的代码会抛出这样的异常:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class java.io.FileDescriptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.example.uploadingfiles.DeepCopyDto["fileArray"]->org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile[0]->org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile["inputStream"]->java.io.FileInputStream["fd"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.13.1.jar:2.13.1]
at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1300) ~[jackson-databind-2.13.1.jar:2.13.1]
...
问题
有没有办法告诉杰克逊忽略一个特定类型的数组/集合的属性?
【问题讨论】:
-
你试过了吗:
.addMixIn(MultipartFile[].class, JacksonMixInForIgnoreType.class)?它应该以相同的方式工作。您使用哪个版本的 Jackson?