#java #rest #spring-boot #curl
#java #rest #весенняя загрузка #curl
Вопрос:
Я работаю над приложением Java Spring boot, где я получаю сообщение об ошибке «Ошибка горячей замены», и изменение схемы не реализовано, и операция не поддерживается виртуальной машиной. После этого таблица усекается и вообще не содержит данных.
У меня есть 2 модели, представленные ниже,
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
@NotNull
@NotEmpty
private String name;
@Column(name = "countryName")
@NotNull
@NotEmpty
private String countryName;
@Column(name = "currencyName")
@NotNull
@NotEmpty
private String currencyName;
/*
* total steps is for the keepign the history of the user movement
* */
@Column(name = "totalSteps")
@Min(value = 0L, message = "The value must be positive")
private int totalSteps;
/*
* current steps is for providing the user reward. We will need to set
* it to zero after processing the user payment
* */
@Column(name = "currentSteps")
@Min(value = 0L, message = "The value must be positive")
private int currentSteps;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List<RewardList> rewardLists = new ArrayList<>();
public User() {
}
public User(@NotNull @NotEmpty String name, @NotNull @NotEmpty String countryName) {
this.name = name;
this.countryName = countryName;
}
public User(@NotNull @NotEmpty String name, @NotNull @NotEmpty String countryName, @Min(value = 0L, message = "The value must be positive") int totalSteps) {
this.name = name;
this.countryName = countryName;
this.totalSteps = totalSteps;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCountryName() {
return countryName;
}
public String getCurrencyName() {
return currencyName;
}
public void setCurrencyName(String currencyName) {
this.currencyName = currencyName;
}
public void setCountryName(String countryName) {
this.countryName = countryName;
}
public int getTotalSteps() {
return totalSteps;
}
public void setTotalSteps(int totalSteps) {
this.totalSteps = totalSteps;
}
public int getCurrentSteps() {
return currentSteps;
}
public void setCurrentSteps(int currentSteps) {
this.currentSteps = currentSteps;
}
public List<RewardList> getRewardLists() {
return rewardLists;
}
public void setRewardLists(RewardList rl) {
this.rewardLists.add(rl);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return getTotalSteps() == user.getTotalSteps() amp;amp;
getCurrentSteps() == user.getCurrentSteps() amp;amp;
getId().equals(user.getId()) amp;amp;
getName().equals(user.getName()) amp;amp;
getCountryName().equals(user.getCountryName()) amp;amp;
getRewardLists().equals(user.getRewardLists());
}
@Override
public int hashCode() {
return Objects.hash(getId(), getName(), getCountryName(), getTotalSteps(), getCurrentSteps(), getRewardLists());
}
@Override
public String toString() {
return "User{"
"id=" id
", name='" name '''
", countryName='" countryName '''
", totalSteps=" totalSteps
", currentSteps=" currentSteps
'}';
}
}
@Entity
public class RewardList {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "reward")
@Min(value = 0L, message = "The value must be positive")
private double reward;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;
public RewardList() {
}
public RewardList(User user) {
this.user = user;
}
public RewardList(@Min(value = 0L, message = "The value must be positive") double reward) {
this.reward = reward;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public double getReward() {
return reward;
}
public void setReward(double reward) {
this.reward = reward;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof RewardList)) return false;
RewardList list = (RewardList) o;
return Double.compare(list.getReward(), getReward()) == 0 amp;amp;
getId().equals(list.getId()) amp;amp;
getUser().equals(list.getUser());
}
@Override
public int hashCode() {
return Objects.hash(getId(), getReward(), getUser());
}
@Override
public String toString() {
return "RewardList{"
"id=" id
", reward=" reward
", user=" user
'}';
}
}
Конечная точка, в которой у меня возникла эта проблема, приведена ниже,
// $ curl -X PUT http://localhost:8080/api/v1/users/calculateReward?userId=1 | jq
@PutMapping("/calculateReward")
public ResponseEntity<Object> calculateReward(@RequestParam("userId") Long userId) {
Optional<User> optional = userService.findById(userId);
if (!optional.isPresent()) {
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
User user = optional.get();
double reward = user.getCurrentSteps() * Parameters.REWARD_PER_STEPS_EUR;
RewardList list = new RewardList();
list.setUser(user);
list.setReward(reward);
rewardListService.save(list);
user.setCurrentSteps(0);
user.setRewardLists(list);
userService.save(user);
JSONObject json = new JSONObject();
double convertionRateToEuro = currencyMap.get(user.getCurrencyName());
double rewardConverted = reward * convertionRateToEuro;
json.put("name", user.getName());
json.put("currency", user.getCurrencyName());
json.put("reward", rewardConverted);
return ResponseEntity.status(HttpStatus.CREATED).body(json);
}
Кто-нибудь знает, что происходит, и может предложить решение?
Спасибо.
Ответ №1:
Я нахожу причину и ниже я предоставляю решение. Нам нужно будет сохранить модели на основе иерархии. HotSwap не поддерживает добавление методов или изменений иерархии, как указано в сообщениях об ошибках. Это ограничение Java HotSwap, а не IntelliJ IDEA. Правильный способ последовательности кода будет,
User user = optional.get();
RewardList list = new RewardList();
list.setUser(user);
list.setReward(reward);
user.setCurrentSteps(0);
user.setRewardLists(list);
// first save the User
userService.save(user);
// Then, save the RewardList as it has one to many relations
rewardListService.save(list);