MultipartFile
),所以我无法使用像https://stackoverflow.com/a/64066/3902663那样使用
ObjectOutputStream
/ObjectInputStream
的策略。 transient
修饰符来忽略这些字段。我尝试用杰克逊的
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 忽略特定类型的数组/集合的属性吗?
我正在使用 Jackson Databind 2.13.1。以下代码适用于
MultipartFile[]
(基于@Michał Ziober 的评论):
private Object makeClone(Object obj) {
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(MultipartFile.class, JacksonMixInForIgnoreType.class);
mapper.addMixIn(MultipartFile[].class, JacksonMixInForIgnoreType.class);
try {
return mapper.readValue(mapper.writeValueAsString(obj), obj.getClass());
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
而且我找不到用
List<MultipartFile>
忽略 ObjectMapper#addMixIn()
的方法。
TypeFactory typeFactory = mapper.getTypeFactory();
CollectionType collectionType = typeFactory.constructCollectionType(List.class, MultipartFile.class);
mapper.configOverride(collectionType.getRawClass()).setIsIgnoredType(true);
此代码对我有用,请尝试。