首页 > 解决方案 > 使用jackson将字段解析为json时,如何将字段添加到现有POJO?

问题描述

我有一个看起来像这样的 Pojo 类

@Table(name = "attachments")
public class Attachment {

@Column(name="id")
private Integer id;

@Column(name = "uuid")
private String uuid;

@Column(name = "customer_id")
private Integer customerId;

@Column(name = "size")
private Integer size;

@Column(name = "uploaded_to_minio")
private Boolean uploaded;

@Column(name = "created_at")
private LocalDateTime created;

@Column(name = "updated_at")
private LocalDateTime updated;

@Column(name = "name")
private String name;

@JsonAppend(
        attrs = {
                @JsonAppend.Attr(value = "DownloadLink")
        }
)
public static class DownloadLink {}
// Getters, Setters omitted
}

当我调用 REST 端点时,例如: localhost:8080/attachments/2500 我得到一个像这样的 Json。(2500 是此上下文中的客户 ID,端点返回 List<>)

{
    "id": 7,
    "uuid": "8980560a-f9af-4ce5-80a6-9da384f8f886",
    "customerId": 2500,
    "size": 336430,
    "uploaded": false,
    "created": {
        "hour": 11,
        "minute": 24,
        "second": 8,
        "nano": 0,
        "dayOfYear": 311,
        "dayOfWeek": "WEDNESDAY",
        "month": "NOVEMBER",
        "dayOfMonth": 7,
        "year": 2018,
        "monthValue": 11,
        "chronology": {
            "calendarType": "iso8601",
            "id": "ISO"
        }
    },
    "updated": null,
    "name": "image_2500_20130916_11_41_17.jpeg"
}
    // other json omitted

它成功返回 List<> of Attachment。现在,我要做的是添加一个字段“downloadLink” JsonAppend,就像调用个人 ID 时一样,例如 localhost:8080/attachments/2500/7

{
"id": 7,
"uuid": "8980560a-f9af-4ce5-80a6-9da384f8f886",
"customerId": 2500,
"size": 336430,
"uploaded": false,
"created": [
    2018,
    11,
    7,
    11,
    24,
    8
],
"updated": null,
"name": "image_2500_20130916_11_41_17.jpeg",
"DownloadLink": "http://127.0.0.1:9000/test/8980560a-f9af-4ce5-80a6-9da384f8f886/image_2500_20130916_11_41_17.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=EZXTCHKE2YHUNRPI8JCL%2F20181108%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20181108T101712Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=f45023cda340afcb9ba49343c0cf1a5bbb1577e8fcdb52ef59f7c2f25f967874"
}

我可以通过如下所示的方法来实现这一点:

@GET
@Path("customers/{customerId}/{id}")
@Produces(MediaType.APPLICATION_JSON)
public String getAttachmentById(@PathParam("customerId") Integer customerId, @PathParam("id") Integer id) throws Exception {
    Attachment attachment = attachmentService.getAttachment(customerId, id);
    String downloadlink = minioFileServer.getDownloadLinkForFile("test", attachment.getUuid(), attachment.getName());
    ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());        
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.addMixIn(Attachment.class, Attachment.DownloadLink.class);
    ObjectWriter writer = mapper.writerFor(Attachment.class).withAttribute("DownloadLink", downloadlink);
    String jsonString = writer.writeValueAsString(attachment);             
    return jsonString;
}

我真正想做的是返回一个附件实例本身而不是字符串。当我尝试这样做时:

attachment = mapper.readValue(jsonString, Attachment.class);
return attachment;

它给了我没有下载链接的普通 Json,就像第一个 json 一样。当我返回 String 时,它给了我我需要的东西,但是当我返回 Pojo 时,它没有显示下载链接。谁能帮我指出正确的方向?我真的很感激任何帮助。

标签: javajsonjackson

解决方案


推荐阅读