背景
- 我想克隆存储来自Sping 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]
...
问题
有没有办法告诉Jackson忽略一个特定类型的数组/集合属性?
1条答案
按热度按时间c6ubokkw1#
我使用的是JacksonDatabind 2.13.1,下面的代码适用于
MultipartFile[]
(基于@ MichaZiober的评论):我找不到用
ObjectMapper#addMixIn()
忽略List<MultipartFile>
的方法。