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);
}
Wie deklarieren Sie 'dataService'? Kannst du diesen Code posten? – bphilipnyc
Setzen Sie Geschäftslogik in die Service-Schicht. Es ist sauberer, als den Controller damit zu verschrotten. –