Каков наилучший способ отправки необязательных дополнительных атрибутов с помощью REST / JPA? - PullRequest
1 голос
/ 08 ноября 2019

У меня есть следующая таблица, определенная с помощью JPA:

@Data
@Entity
public class Project {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  @Column(unique = true)
  private String name;

  private Integer budget;

  private String description;

  private Boolean isArchived;

  private LocalDate archivedDate;

  @Transient
  private Integer usedBudget;

  @NotNull
  @ManyToOne
  private Customer customer;
}

У меня есть метод REST-API getProjects(), который возвращает все проекты из базы данных. usedBudged не сохраняется в базе данных и должен быть рассчитан. В большинстве случаев, когда я звоню getProjects(), мне не нужен атрибут usedBudget. Но в одном случае я хотел бы рассчитать usedBudget проекта и отправить его напрямую с объектом проекта, поэтому мне не нужно сначала получать все проекты и делать отдельный вызов API для каждого проекта, чтобы получить usedBudget,Поэтому для достижения этого я добавил свойство usedBudget к объекту Project и пометил его как временное. Таким образом, он не сохраняется в базе данных, и когда я хочу получить usedBudget, я просто вычисляю его и устанавливаю перед возвратом объекта проекта. Единственная проблема заключается в том, что, даже если он не установлен (ноль), он получает отправку через JSON. Есть ли способ игнорировать / не отправлять это временное значение всякий раз, когда его значение равно нулю?

Другим решением моей проблемы может быть вспомогательный класс, который расширяет Project и имеет этот дополнительный атрибут usedBudget. Поэтому, когда мне нужно usedBudget, я возвращаю вспомогательный класс, а всякий раз, когда я этого не делаю, я просто возвращаю обычный проект (в этом случае нет временного свойства usedBudget). Таким образом, я бы никогда не отправил бесполезные нулевые значения.

Какой из подходов лучше и есть, может быть, лучший?

1 Ответ

0 голосов
/ 08 ноября 2019

У вас должно быть четкое разделение между сохраняющимися объектами (сущностями) и объектами, которые обслуживает REST API: они называются DTO . Например:

@Data
public class ProjectDTO {

    private long id;
    private String name;
    private Integer budget;
    private String description;
    private Boolean isArchived;
    private LocalDate archivedDate;
    private Customer customer;
}

Но если в конкретном контексте вам необходимо вернуть проект с использованным бюджетом, вы можете использовать это DTO:

@Data
public class ProjectWithBudgetDTO extends ProjectDTO {

    private Integer usedBudget;
}

Конечно, это требует немногоработы по созданию dto из сущности, но это довольно просто.

Таким образом, API отделен от модели постоянных данных, что позволяет им развиваться по-разному. Например, вы можете добавить новое поле в вашу базу данных, мешая остальным клиентам API. Или даже удалите поле и оставьте в DTO значение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...