Должна ли версия быть частью DTO, возвращаемого API?

#java #rest #etag

#java #rest #etag

Вопрос:

У меня есть объекты с полем версии.

 @Data
@NoArgsConstructor
@AllArgsConstructor
@javax.persistence.Entity
@Table(name = "meals", catalog = "nutrientTracker")
public class Meal implements Entity<Long> {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;

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

    @Column(name = "date")
    private LocalDateTime date;

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

    @Column(name = "eaten")
    private boolean eaten;

    @Column(name = "price")
    private float price;

    @Column(name = "latitude")
    private double latitude;

    @Column(name = "longitude")
    private double longitude;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

    @Version
    @Column(name = "VERSION")
    private long version;

    @Override
    public Long getId() {
        return this.id;
    }
}
 

В контексте моего приложения я рассматриваю поле версии как ETag.
Мой DTO выглядит следующим образом:

 @Data
@AllArgsConstructor
@NoArgsConstructor
public class MealDTO implements DTO<Meal, Long> {
    @ApiModelProperty(required = true, example = "-1", value = "id")
    private long id;

    @ApiModelProperty(required = true, example = "tasty", value = "comment")
    private String comment;

    @ApiModelProperty(example = "1994-11-05T13:15:30Z", value = "date")
    private LocalDateTime date;

    @ApiModelProperty(example = "1605294438", value = "dateEpoch")
    private long dateEpoch;

    @ApiModelProperty(required = true, example = "banana,apple", value = "foods")
    private String foods;

    @ApiModelProperty(example = "false", value = "eaten")
    private boolean eaten;

    @ApiModelProperty(example = "6.9", value = "price")
    private float price;

    @ApiModelProperty(example = "69.6969696969", value = "latitude")
    private double latitude;

    @ApiModelProperty(example = "42.0420420420", value = "longitude")
    private double longitude;

    @ApiModelProperty(example = "1", value = "userId")
    private long userId;

    @ApiModelProperty(example = "1", value = "etag")
    private String etag;
}
 

где я сопоставляю версию с полем ETag.

Мой вопрос заключается в следующем:

Должен ли я возвращать ETag из API в виде поля? Или иметь ее только в заголовках? Плохая ли практика иметь ее в самой сущности? На стороне клиента я делаю что-то вроде:

 const result: Meal = response.data;
result.etag = response.headers['etag'];
return resu<
 

в любом случае. Это тоже плохая практика?

Ответ №1:

Нет.

Столбец version используется при выполнении определенных операций с базой данных и, как таковой, не должен предоставляться пользователю API. Согласно документам @Version:

Указывает поле версии или свойство класса сущностей, которое служит его оптимистичным значением блокировки. Версия используется для обеспечения целостности при выполнении операции слияния и для оптимального управления параллелизмом.

Комментарии:

1. Хорошо, вместо этого я использовал его в хэше MD5 для своего ETag вместе с некоторым ключом на стороне сервера. Это хорошо?

2. ДА. Я бы так подумал.