Spring-hibernate调试

时间:2017-05-17 19:43:20

标签: java spring hibernate spring-mvc

我有一个非常奇怪的问题。我试图在篮子里展示产品的价格。当我运行代码并将产品添加到购物篮时,我可以看到产品的名称,但我看不到它的价格。当我点击回到上一页并添加另一个产品时,我能够看到它的价格。没有错误消息。

此外,当我尝试调试此程序时,一切正常。只有在我没有调试时才会出现问题。问题与这两个变量密切相关,如下所示。我认为这些变量是0,后来打印在屏幕上。但我不知道为什么他们有时候会有0而有时候不会。我还尝试设置断点:

dataService.getQuantityOfDays();

dataService.getQuantityOfBreakfasts();

当我在Data类中为这两个变量赋值时,一切正常(不是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";
}

编辑:

这是一个存储库代码。

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

}

问题也可以在篮子里保存。当我只能看到零时我坚持篮子,然后我只是更新它。

保存&amp;更新方法:

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

修改

我在这个应用程序的前面调用了setQuantityOfDaysAndBreakfasts(text)。在这个控制器中,我只将这些值设置为basketItem类。我会改变这个控制器。这里是另一个控制器,我调用setQuantityOfDaysAndBreakfasts(text)。

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

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


}

1 个答案:

答案 0 :(得分:0)

setQuantityOfDaysAndBreakfasts()获取值后,您正在呼叫dataServicequantityOfDaysquantityOfBreakfasts的值仅在调用该方法时设置。

您还应该检查几件事。

正如@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));

应完全重构为一个单独的方法,该方法可以是静态的,不属于该类。