#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. ДА. Я бы так подумал.