java - 使用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 时,它没有显示下载链接。谁能帮我指出正确的方向?我真的很感激任何帮助。
解决方案
推荐阅读
- uikit - 如何在@IBsegueAction 函数中获得正确的行?
- vb.net - 在我的浏览器中从 Visual Studio 2013 调试 asp.net webform 时出现乱码
- c++ - How to reset std::count return value
- python-3.x - PhotoImage GIF 不会出现(请新手友好)
- wordpress - Wordpress - Footer not appearing on product pages
- django - How to create User and User Profile in a single Django Admin form
- reactjs - React - how to render multiple buttons with a regular for loop?
- c++ - 为什么在 c++ 中使用 ios::sync_with_stdio(false) 之后在 cout 之前执行 printf?
- javascript - 如何在跨度标签上触发/显示弹出框?
- java - FragmentTransaction.replace() 崩溃 - 但仅在发布版本中