@Autowired
private ItemService itemService;
@Value("${COOKIE_CART_EXPIRE}")
private int COOKIE_CART_EXPIRE;
@Autowired
private CartService cartService;
@RequestMapping("/cart/add/{itemId}")
//响应一个页面,所以用String
public String addToCart(@PathVariable Long itemId,@RequestParam(defaultValue="1")Integer num,
HttpServletRequest request,HttpServletResponse response) {
//判断用户是不是登陆
TbUser user = (TbUser) request.getAttribute("user");
if(user!=null){
//登陆了的话,保存到服务端,返回逻辑视图
cartService.addCart(user.getId(), itemId, num);
return "cartSuccess";
}
//未登陆
//从cookie中取购物车列表
List<TbItem> cartList = getCartListFromCookie(request);
//判断商品在商品购物车列表中是不是存在
boolean flag = false;
if(cartList!=null){
flag=true;
}/待会加点代码在这里
//如果存在,就数量相加
if(flag) {
for(TbItem tbItem:cartList) {
if(tbItem.getId()==itemId.longValue()) {
//找到商品,数量相加
tbItem.setNum(tbItem.getNum()+num);
break;
}
}
}
//如果不存在,那就商品id查询商品信息,得到一个TbItem对象
if(!flag) {
TbItem tbItem = itemService.getItemById(itemId);
String image=null;
//数量要换
tbItem.setNum(num);
//取一张图
image = tbItem.getImage();
if(StringUtils.isNotBlank(image)) {
tbItem.setImage(image.split(",")[0]);
}
//把商品添加到商品购物车列表
cartList.add(tbItem);
}
//商品购物车列表写入cookie
CookieUtils.setCookie(request, response,"cart", JsonUtils.objectToJson(cartList),COOKIE_CART_EXPIRE,true);
//返回成功页面
return "cartSuccess";
}
Servlet.service() for servlet [e3-cart-web] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause java.lang.NullPointerException
at cn.e3mall.cart.controller.CartController.addToCart(CartController.java:80)
就是这个位置报了个空指针错误,我就一路找回去,发现逻辑上是有点不对,如果查到的cookie中的商品列表是空的也就是说List<TbItem> cartList =null;这个时候我是不可以给这个cartList 添加任何东西的,必须要先给他一个空集合才可以添加商品。
所以我在上面判断加了一句:
else {
cartList=new ArrayList<TbItem>();
}
将cartList初始化再来加商品,就可以运行了。