2017-05-17 16 views
0

私は非常に奇妙な問題があります。私はバスケットに製品の価格を表示しようとしています。コードを実行してバスケットに商品を追加すると、商品の名前がわかりますが、価格は表示されません。前のページに戻って別の商品を追加すると、その価格が表示されます。エラーメッセージはありません。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); 


} 
+0

どのように 'dataService'を宣言していますか?あなたはそのコードを投稿できますか? – bphilipnyc

+0

ビジネスロジックをサービスレイヤに配置します。それはそれを使用してコントローラをジャンクアップするよりもきれいです。 –

答えて

0

あなたdataServiceから値を取得した後、あなたはsetQuantityOfDaysAndBreakfasts()を呼んでいます。 quantityOfDaysquantityOfBreakfastsの値は、そのメソッドが呼び出されたときにのみ設定されます。

さらに検討する必要があることがいくつかあります。

@NathanHughesが指摘しているように、複雑なロジックをサービスレイヤーに配置し、コントローラから単純にリクエストをルーティングすることをお勧めします。これはあなたのリポジトリクラスにも当てはまります。あなたのコードを読んでいる次の開発者は、単にデータソースを読み書きするだけのロジックがないと思うので、これは非常にシンプルにしておいてください。また、将来的にはコードの重複を減らし、結果としてバグの管理と修正にかかる時間を短縮することができます(単一責任の原則を参照してください)。

例えば、このコード:

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)); 

は、静的行うことができ、そのクラスに属さない全く別のメソッドにリファクタリングされるべきです。