У меня есть класс 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": 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
Успешно возвращает список <> из Attachment
. Теперь, что я хочу сделать, это добавить поле «downloadLink» как JsonAppend
, когда вызывается отдельный идентификатор, например, этот 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, а не String. Когда я попытался сделать это так:
attachment = mapper.readValue(jsonString, Attachment.class);
return attachment;
Это дает мне простой Json без ссылки на скачивание, как в первом json. Когда я возвращаю String, он дает мне то, что мне нужно, но когда я возвращаю Pojo, он не показывает ссылку для скачивания. Может ли кто-нибудь, пожалуйста, помогите мне указать правильное направление? Буду очень признателен за любую помощь.