2017-05-17 2 views
0

Ich habe ein sehr seltsames Problem. Ich versuche, in einem Korb den Preis von Produkten zu zeigen. Wenn ich den Code ausführe und ein Produkt zum Warenkorb hinzufüge, kann ich den Namen des Produkts sehen, aber ich kann seinen Preis nicht sehen. Wenn ich auf eine vorherige Seite zurückklicke und ein anderes Produkt hinzufüge, kann ich den Preis sehen. Es gibt keine Fehlermeldung.Spring-Hibernate debug

Auch wenn ich versuche, dieses Programm zu debuggen, funktioniert alles. Das Problem tritt nur auf, wenn ich nicht debugge. Das Problem hängt eng mit diesen beiden Variablen zusammen, wie unten angegeben. Ich denke, dass diese Variablen 0 sind, die später auf dem Bildschirm gedruckt werden. Aber ich weiß nicht, warum sie manchmal 0 sind und manchmal nicht. Ich habe auch versucht, Breakpoints setzen auf:

dataService.getQuantityOfDays(); 

dataService.getQuantityOfBreakfasts(); 

Wenn ich Werte für diese beiden Variablen in Datenklasse zuzuordnen ist alles ok (nicht 0).

Controller-Code:

@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:

Es ist ein Repository-Code.

@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; 
} 

}

Ein Problem kann auch sparen im Korb sein. Erst wenn ich nur Nullen sehen kann, behalte ich den Warenkorb, dann aktualisiere ich ihn nur.

speichern & Aktualisierungsmethoden:

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

Ich setQuantityOfDaysAndBreakfasts (Text) weiter oben in diesem apllication Aufruf. In diesem Controller setze ich diese Werte nur auf basketItem Klasse. Ich werde diesen Controller ändern. Hier ein anderer Controller, wo ich setQuantityOfDaysAndBreakfasts (text) anrufe.

@RequestMapping(value = "/room/rest", method = RequestMethod.POST, consumes = {"application/json"}) 
public void data(@RequestBody Data request){ 

    String text = request.getText(); 
    dataService.setQuantityOfDaysAndBreakfasts(text); 


} 
+0

Wie deklarieren Sie 'dataService'? Kannst du diesen Code posten? – bphilipnyc

+0

Setzen Sie Geschäftslogik in die Service-Schicht. Es ist sauberer, als den Controller damit zu verschrotten. –

Antwort

0

Sie rufen setQuantityOfDaysAndBreakfasts(), nachdem Sie den Wert von Ihrem dataService erhalten. Der Wert für quantityOfDays und quantityOfBreakfasts wird nur festgelegt, wenn diese Methode aufgerufen wird.

Es gibt mehrere Dinge, die Sie ebenfalls untersuchen sollten.

Wie @NathanHughes hervorhebt, ist es am besten, Ihre komplexe Logik in Ihre Service-Schicht zu legen und den Controller zu lassen, um Anfragen einfach zu routen. Dies gilt auch für Ihre Repository-Klasse. Sie sollten dies sehr einfach halten, da der nächste Entwickler, der Ihren Code liest, keine Logik erwartet, die nicht einfach Ihre Datenquelle liest oder schreibt. (Siehe Prinzip der einfachen Verantwortung.) Es wird auch die Code-Duplizierung in der Zukunft reduzieren und dadurch Ihre Zeit reduzieren, Fehler zu beheben und zu beheben.

Zum Beispiel dieser Code:

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

Sollte vollständig auf ein separates Verfahren geändert werden die statisch gemacht werden kann und nicht in dieser Klasse gehören.