弹簧启动“ Whitelabel错误页面”无可用消息

时间:2018-12-01 14:34:27

标签: java spring spring-boot spring-webflow

我正在创建Web应用程序,客户可以在其中购物并在购物车中添加产品。当我尝试确认订单时,出现“ Whitelabel错误页面”。我写结帐流程。当我单击付款按钮时,它将显示确认订单并显示购物车详细信息。但是,当我单击“付款”按钮时,它显示了Whitelabel错误页面。请告诉我为什么我会收到此错误。

checkout-flow.xml

    <?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/webflow
                          http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">


    <var name="shipping" class="net.kzn.shoppingbackend.dto.Address"/>

    <on-start>
        <evaluate expression="checkoutHandler.init(currentUser.name)" result="flowScope.checkoutModel"/>
    </on-start>

    <!-- view the address selection page-->
    <view-state id="shipping" view="order-address.jsp" model="shipping">
        <on-entry>
            <evaluate expression="checkoutHandler.getShippingAddresses(flowScope.checkoutModel)" result="viewScope.addresses"/> 
        </on-entry>
        <transition on="addressSelection" to="saveAddressSelection" validate="false"/>
        <transition on="saveAddress" to="saveAddress" />
    </view-state>

    <!-- action state to save the address -->
    <action-state id="saveAddressSelection">        
        <evaluate expression="checkoutHandler.saveAddressSelection(flowScope.checkoutModel, requestParameters.shippingId)" />
        <transition on="success" to="payment" />
    </action-state>


    <!-- action state to save the address -->
    <action-state id="saveAddress">     
        <evaluate expression="checkoutHandler.saveAddress(flowScope.checkoutModel, shipping)" />
        <transition on="success" to="payment" />
    </action-state>

    <!-- view the payment mode page-->
    <view-state id="payment" view="order-payment.jsp" model="flowScope.checkoutModel">      
        <transition on="pay" to="saveOrder" />  
    </view-state>

    <!-- action state to save the address -->
    <action-state id="saveOrder">       
        <evaluate expression="checkoutHandler.saveOrder(flowScope.checkoutModel)" />
        <transition on="success" to="receipt"/>
    </action-state>

    <!-- end state -->
    <end-state id="receipt" view="order-confirm.jsp">
        <on-entry>
            <evaluate expression="checkoutHandler.getOrderDetail(flowScope.checkoutModel)" result="requestScope.orderDetail"/>
        </on-entry>
    </end-state>

    <end-state id="home" view="externalRedirect:contextRelative:/home" />
    <end-state id="error" view="flows/flows-shared/error" />

    <!-- global transition -->
    <global-transitions>
        <transition on="home" to="home" validate="false" />
        <transition on-exception="java.lang.Exception" to="error" />
    </global-transitions>

</flow>

order-payment.jsp

    <%@include file="../../flows-shared/header.jsp" %>
<div class="container mt-5">

    <div class="row">
            <!--  To display all the goods -->
            <div class="col-md-6">

                <div class="row">
                    <c:forEach items="${checkoutModel.cartLines}" var="cartLine">
                    <div class="col-12">

                        <div>
                            <h3>${cartLine.product.name}</h3>
                            <hr/>
                            <h4>Quantity -${cartLine.productCount}</h4>
                            <h5>Buying Price - &#8377; ${cartLine.buyingPrice}/-</h5>                           
                        </div>                      
                        <hr/>
                        <div class="text-right">
                            <h3>Grand Total - &#8377; ${cartLine.total}/-</h3>
                        </div>                      
                    </div>
                    </c:forEach>
                </div>


            </div>

            <div class="col-md-6">
                <div class="card">
                    <div class="card-header">
                        <h3 class="card-title">
                            Payment Details
                        </h3>
                    </div>
                    <div class="card-body">
                        <form role="form">
                        <div class="form-group">
                            <label for="cardNumber">
                                CARD NUMBER</label>
                            <div class="input-group">
                                <input type="text" class="form-control" id="cardNumber" placeholder="Valid Card Number"
                                    required autofocus />
                                <span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span>
                            </div>
                        </div>
                        <div class="row">

                        </div>
                        </form>
                    </div>
                </div>
                <ul class="nav nav-pills nav-stacked">
                    <li class="active"><a href="#"><span class="badge pull-right"> &#8377; ${checkoutModel.checkoutTotal}/-</span> Final Payment</a></li>
                </ul>
                <br/>
                 <a href="${flowExecutionUrl}&_eventId_pay" class="btn btn-success btn-lg btn-block" role="button">Pay</a>

            </div>
    </div>
</div>

checkouthandler.java

    package net.kzn.onlineshopping.handler;

@Component
public class CheckoutHandler {

    private static final Logger logger = LoggerFactory
            .getLogger(CheckoutHandler.class);

    @Autowired
    private UserDAO userDAO;

    @Autowired
    private ProductDAO productDAO;

    @Autowired
    private CartLineDAO cartLineDAO;

    @Autowired
    private HttpSession session;

    public CheckoutModel init(String name) throws Exception {

        User user = userDAO.getByEmail(name);
        CheckoutModel checkoutModel = null;

        if (user != null) {
            checkoutModel = new CheckoutModel();
            checkoutModel.setUser(user);
            checkoutModel.setCart(user.getCart());

            double checkoutTotal = 0.0;
            List<CartLine> cartLines = cartLineDAO.listAvailable(user.getCart()
                    .getId());

            if (cartLines.size() == 0) {
                throw new Exception(
                        "There are no products available for checkout now!");
            }

            for (CartLine cartLine : cartLines) {
                checkoutTotal += cartLine.getTotal();
            }

            checkoutModel.setCartLines(cartLines);
            checkoutModel.setCheckoutTotal(checkoutTotal);
        }

        return checkoutModel;
    }

    public String saveOrder(CheckoutModel checkoutModel) {
        String transitionValue = "success";

        // create a new order object
        OrderDetail orderDetail = new OrderDetail();

        // attach the user
        orderDetail.setUser(checkoutModel.getUser());

        // attach the shipping address
        orderDetail.setShipping(checkoutModel.getShipping());

        // fetch the billing address
        Address billing = userDAO.getBillingAddress(checkoutModel.getUser()
                .getId());
        orderDetail.setBilling(billing);

        List<CartLine> cartLines = checkoutModel.getCartLines();
        OrderItem orderItem = null;

        double orderTotal = 0.0;
        int orderCount = 0;
        Product product = null;

        for (CartLine cartLine : cartLines) {

            orderItem = new OrderItem();

            orderItem.setBuyingPrice(cartLine.getBuyingPrice());
            orderItem.setProduct(cartLine.getProduct());
            orderItem.setProductCount(cartLine.getProductCount());
            orderItem.setTotal(cartLine.getTotal());

            orderItem.setOrderDetail(orderDetail);
            orderDetail.getOrderItems().add(orderItem);

            orderTotal += orderItem.getTotal();
            orderCount++;

            // update the product
            // reduce the quantity of product
            product = cartLine.getProduct();
            product.setQuantity(product.getQuantity()
                    - cartLine.getProductCount());
            product.setPurchases(product.getPurchases()
                    + cartLine.getProductCount());
            productDAO.update(product);

            // delete the cartLine
            cartLineDAO.remove(cartLine);

        }

        orderDetail.setOrderTotal(orderTotal);
        orderDetail.setOrderCount(orderCount);
        orderDetail.setOrderDate(new Date());

        // save the order
        cartLineDAO.addOrderDetail(orderDetail);

        // set it to the orderDetails of checkoutModel
        checkoutModel.setOrderDetail(orderDetail);

        // update the cart
        Cart cart = checkoutModel.getCart();
        cart.setGrandTotal(cart.getGrandTotal() - orderTotal);
        cart.setCartLines(cart.getCartLines() - orderCount);
        cartLineDAO.updateCart(cart);

        // update the cart if its in the session
        UserModel userModel = (UserModel) session.getAttribute("userModel");
        if (userModel != null) {
            userModel.setCart(cart);
        }

        return transitionValue;
    }

    public OrderDetail getOrderDetail(CheckoutModel checkoutModel) {
        return checkoutModel.getOrderDetail();
    }

}

CartController.java

    package net.kzn.onlineshopping.controller;

@Controller
@RequestMapping("/cart")
public class CartController {

    private final static Logger logger = LoggerFactory.getLogger(CartController.class);

    @Autowired
    private CartService cartService;

    @RequestMapping("/show")
    public ModelAndView showCart(@RequestParam(name = "result", required = false) String result) {

        ModelAndView mv = new ModelAndView("page");
        mv.addObject("title", "Shopping Cart");
        mv.addObject("userClickShowCart", true);

        if (result != null) {
            switch (result) {
            case "added":
                mv.addObject("message", "Product has been successfully added inside cart!");
                cartService.validateCartLine();
                break;
            case "unavailable":
                mv.addObject("message", "Product quantity is not available!");
                break;
            case "updated":
                mv.addObject("message", "Cart has been updated successfully!");
                cartService.validateCartLine();
                break;
            case "modified":
                mv.addObject("message", "One or more items inside cart has been modified!");
                break;
            case "maximum":
                mv.addObject("message", "Maximum limit for the item has been reached!");
                break;
            case "deleted":
                mv.addObject("message", "CartLine has been successfully removed!");
                break;

            }
        } else {
            String response = cartService.validateCartLine();
            if (response.equals("result=modified")) {
                mv.addObject("message", "One or more items inside cart has been modified!");
            }
        }

        mv.addObject("cartLines", cartService.getCartLines());
        return mv;

    }

    @RequestMapping("/{cartLineId}/update")
    public String udpateCartLine(@PathVariable int cartLineId, @RequestParam int count) {
        String response = cartService.manageCartLine(cartLineId, count);
        return "redirect:/cart/show?" + response;
    }

    @RequestMapping("/add/{productId}/product")
    public String addCartLine(@PathVariable int productId) {
        String response = cartService.addCartLine(productId);
        return "redirect:/cart/show?" + response;
    }

    @RequestMapping("/{cartLineId}/remove")
    public String removeCartLine(@PathVariable int cartLineId) {
        String response = cartService.removeCartLine(cartLineId);
        return "redirect:/cart/show?" + response;
    }

    /*
     * after validating it redirect to checkout if result received is success
     * proceed to checkout else display the message to the user about the changes in
     * cart page
     */
    @RequestMapping("/validate")
    public String validateCart() {
        String response = cartService.validateCartLine();
        if (!response.equals("result=success")) {
            return "redirect:/cart/show?" + response;
        } else {
            return "redirect:/cart/checkout";
        }
    }
}

错误

            [dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [/onlineshopping] threw exception [Handler dispatch failed; nested exception is java.lang.StackOverflowError] with root cause

        java.lang.StackOverflowError: null
            at org.springframework.util.CollectionUtils.isEmpty(CollectionUtils.java:54) ~[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE]
            at org.springframework.util.StringUtils.collectionToDelimitedString(StringUtils.java:1249) ~[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE]

日志文件

Please check log file

在Checkout-flow和checkouthandler中是否需要进行任何更改。请告诉我我在做什么错了。

1 个答案:

答案 0 :(得分:0)

 return "redirect:/cart/checkout";

根据我所见,这没有请求映射。添加类似

 @RequestMapping("/checkout")
 public String checkout() {
    ...
 }

我在看线

2018-12-01 20:16:30.926  INFO 11108 --- [nio-8080-exec-5] o.s.w.c.s.GenericWebApplicationContext   : Refreshing Flow ApplicationContext [cart/checkout]: startup date [Sat Dec 01 20:16:30 IST 2018]; parent: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@519e7762