使用 Jackson 将文件类型从 Angular 反序列化为 Java

Posted

技术标签:

【中文标题】使用 Jackson 将文件类型从 Angular 反序列化为 Java【英文标题】:Deserialization of File type from Angular to Java using Jackson 【发布时间】:2018-02-26 14:37:06 【问题描述】:

在我使用 SpringBoot 和 Angular 开发的 REST 应用程序中,我需要向 SpringBoot 后端发送一个 REST 请求,以便将对象保存到数据库中。

在前端,用户填写表单并提交。以下是创建对象以便作为 REST 调用发送到后端的接口。

export interface TenderToPost

    id: number;
    name: string;
    description: string;
    images: File[];
    referenceNumber: string;


后端应将上述对象反序列化为Java中Following类的对象。

public class TenderDTO implements Serializable

    private long id;

    private String name;

    private String description;

    private List<MultipartFile> images;

    private String referenceNumber;

    // default constructor

    // geters and setters


如上所示,我需要接受从前端发送的文件为MultipartFile

但是,当从前端发送请求时,Jackson 给了我错误

无法构造实例 org.springframework.web.multipart.MultipartFile:抽象类型或者 需要映射到具体类型,具有自定义反序列化器,或 包含额外的类型信息

我知道这个错误是因为我使用MultipartFile 接口作为我的图像列表的类型。

我认为的解决方案是让杰克逊知道应该使用注释将列表反序列化为哪种类型。所以,我用了以下

@JsonDeserialize(contentAs = CommonsMultipartFile.class)
private List<MultipartFile> images;

CommonsMultipartFile 是MultipartFile 的实现。这就是我使用它的原因。

现在我收到以下错误。

无法构造实例 org.springframework.web.multipart.commons.CommonsMultipartFile:否 找到合适的构造函数,无法从 Object 值反序列化 (缺少默认构造函数或创建者,或者可能需要添加/启用 输入信息?)

我需要更改图像列表的设置器吗?还是我的整个方法都不正确?

请告诉我应该如何纠正这个问题。

【问题讨论】:

你找到解决办法了吗? @PankajSaboo 我使用了一种稍微不同的方法。我从 DTO 中删除了文件,现在我将文件与 DTO 一起发送到地图中。在后端,我接受后端作为地图。(不是直接作为我在问题中提到的 dto) 我做了这个改变,回来了:P 你认为 10 天是很长的时间 eh 如果你解决了这个问题(即使通过重构),发布一个解决方案作为答案会很有帮助,目前遇到这种事情的人可能无法在没有指导的情况下解决这个问题。只是说 【参考方案1】:

尝试使用@JsonPropertyDescription 构造对象。 @JsonPropertyDescription example

【讨论】:

以上是关于使用 Jackson 将文件类型从 Angular 反序列化为 Java的主要内容,如果未能解决你的问题,请参考以下文章

org.codehaus.jackson.map.JsonMappingException:无法从 JSON 字符串实例化类型 [简单类型,类 models.Job] 的值

无法使用 guava-datatype 从 Spring 服务中使用 GWTP-Rest + jackson-guava 反序列化 guava 类型

Jackson 序列化:将字段值设置为 XML 元素名称

使用 Jackson 反序列化对象列表

JSON到POJO作为使用jackson java的对象类

Angular $scope 与文件输入类型冲突