春季休眠调试



我有一个很奇怪的问题。我试图在购物篮中显示产品的价格。当我运行代码并将产品添加到购物篮时,我可以看到产品的名称,但看不到它的价格。当我单击返回上一页并添加其他产品时,我能够看到其价格。 没有错误消息。

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

dataService.getQuantityOfDays();
dataService.getQuantityOfBreakfasts();

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

}

篮筐保存也可能出现问题。第一次,当我只能看到零时,我坚持篮子,然后我只更新它。

保存和更新方法:

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

编辑

我在此应用程序的前面调用setQuantityOfDays和Breakfasts(text)。在此控制器中,我仅将这些值设置为 basketItem 类。我将更改此控制器。这是另一个控制器,我称之为setQuantityOfDays和Breakfasts(text)。

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

}

您在从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));

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

最新更新