私は非常に奇妙な問題があります。私はバスケットに製品の価格を表示しようとしています。コードを実行してバスケットに商品を追加すると、商品の名前がわかりますが、価格は表示されません。前のページに戻って別の商品を追加すると、その価格が表示されます。エラーメッセージはありません。Spring-Hibernateデバッグ
また、このプログラムをデバッグしようとすると、すべてが機能します。この問題は、デバッグしていないときにのみ表示されます。この問題は以下の2つの変数と密接に関連しています。私はこれらの変数は後でスクリーンに印刷される0だと思います。しかし、私はなぜ彼らが時には0か時々そうでないか分からない。
dataService.getQuantityOfDays();
dataService.getQuantityOfBreakfasts();
データクラスのこれらの2つの変数に値を割り当てると、すべてがOK(0ではありません)です。
コントローラーコード:
@RequestMapping("/basket/{roomName}")
public String createBasket(Model model, @PathVariable("roomName") String roomName){
Floor currentFloor = floorService.getCurrentFloor();
User currentUser = userService.getCurrentUser();
this.roomName = roomName;
if(currentFloor != null){
Room currentRoom = roomService.getRoomByName(roomName, currentFloor);
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String name = auth.getName();
if(currentUser == null){
userService.setCurrentUser(userService.getUserByName(name)); // wykona sie jesli nie zakladamy konta w danej sesji
}
Basket basketToSave = new Basket(userService.getCurrentUser());
BasketItem basketItem = new BasketItem(currentRoom);
int quantityOfDays = dataService.getQuantityOfDays(); //<--problem
int quantityOfBreakfast = dataService.getQuantityOfBreakfasts(); //<--problem
int priceForOneBreakfast = 17;
int priceForOneDay = currentRoom.getPriceForOneDay();
int wholePrice = quantityOfDays * priceForOneDay + quantityOfBreakfast * priceForOneBreakfast;
basketItem.setPrice(wholePrice);
basketItem.setQuantityOfDays(quantityOfDays);
basketItem.setQuantityOfBreakfast(quantityOfBreakfast);
Set<BasketItem> basketItemList = new HashSet<BasketItem>();
basketItemList.add(basketItem);
basketService.countBasketPrice(basketItemList, basketToSave);
basketToSave.setBasketItems(basketItemList);
basketItem.setBasket(basketToSave);
currentRoom.setBasketItemList(basketItemList);
boolean ifWasAnUpdate = basketService.save(basketToSave); // metoda save oprócz zapisu lub nadpisania zwraca co się wydarzyło (true - jesli nadpisywaliśmy koszyk)
if(ifWasAnUpdate){
basketItem.setBasket(basketService.get(basketToSave.getUser())); // jeżeli dodaje coś do koszyka (a nie tworzę go od nowa), muszę ustawić basketItemowi
} // koszyk, który już istnieje, a nie ten, który stworzyłem wcześniej w klasie BasketController.
// W tym celu pobieram go z bazy.
basketItemService.save(basketItem);
}
model.addAttribute("basket", basketService.get(currentUser));
model.addAttribute("days", dataService.getQuantityOfDays());
return "basket";
}
EDIT:
それはリポジトリのコードです。
@Repository
public class DataRepositoryImpl implements DataRepository {
private int quantityOfDays;
private int quantityOfBreakfasts;
public void setQuantityOfDaysAndBreakfasts(String text) {
List<Integer> listOfIndexes = new ArrayList<Integer>();
for(int i=0;i<text.length();i++){
if(text.charAt(i) != '1'){
listOfIndexes.add(i);
}
}
char znak = text.charAt(listOfIndexes.get(0));
this.quantityOfDays = Character.getNumericValue(text.charAt(listOfIndexes.get(0))); // <- I put breakpoint here
this.quantityOfBreakfasts = Character.getNumericValue(text.charAt(listOfIndexes.get(1))); // <- I put breakpoint here
}
public int getQuantityOfDays() {
return this.quantityOfDays;
}
public int getQuantityOfBreakfasts() {
return this.quantityOfBreakfasts;
}
}
問題がsaveバスケットにもすることができます。 Firslty私は唯一のゼロを見ることができます私はバスケットを維持し、私はそれを更新しています。
保存&アップデート方法:
public boolean save(Basket basketToSave) {
List<Basket> listOfAllBaskets = getAll();
boolean save = true;
boolean ifWasAnUpdate = false;
for(Basket basket: listOfAllBaskets){
if(basketToSave.getUser().equals(basket.getUser())){
save = false;
}
}
if(save){
emManager.persist(basketToSave);
}else{
updateBasket(basketToSave);
ifWasAnUpdate = true;
}
return ifWasAnUpdate;
}
public void updateBasket(Basket basket) {
Basket basketFromDatabase = get(basket.getUser());
basketFromDatabase.setBasketItems(basket.getBasketItems());
basketFromDatabase.setPrice(basket.getPrice());
emManager.merge(basketFromDatabase);
}
EDIT
私は以前、このapllicationでsetQuantityOfDaysAndBreakfasts(テキスト)を呼んでいます。このコントローラでは、これらの値をbasketItemクラスにのみ設定します。私はこのコントローラを変更します。ここで私はsetQuantityOfDaysAndBreakfasts(テキスト)を呼び出す別のコントローラ。
@RequestMapping(value = "/room/rest", method = RequestMethod.POST, consumes = {"application/json"})
public void data(@RequestBody Data request){
String text = request.getText();
dataService.setQuantityOfDaysAndBreakfasts(text);
}
どのように 'dataService'を宣言していますか?あなたはそのコードを投稿できますか? – bphilipnyc
ビジネスロジックをサービスレイヤに配置します。それはそれを使用してコントローラをジャンクアップするよりもきれいです。 –