Как реализовать страницу ошибки Spring при загрузке - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь создать весеннее приложение, в котором есть страница с ошибкой, если клиент пытается купить продукт, которого нет в наличии. Я получаю сообщение об ошибке HTTP Status 500 - Request processing failed; nested exception is java.lang.NullPointerException всякий раз, когда пытаюсь это проверить. Я пробовал множество подходов, я чувствую, что я рядом.

Пожалуйста, смотрите ниже для контроллера, класс ошибок просто имеет геттеры и сеттеры и т. Д. c

Любая помощь будет высоко ценится !!!

package com.sales.controllers;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.validation.Valid;

import org.apache.taglibs.standard.lang.jstl.LessThanOperator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.sales.exceptions.ErrorController;
import com.sales.models.Customer;
import com.sales.models.Order;
import com.sales.models.Product;
import com.sales.services.CustomerService;
import com.sales.services.OrderService;
import com.sales.services.ProductService;

@Controller                             //implementing the error class here
public class OrderController implements org.springframework.boot.autoconfigure.web.ErrorController {

    @Autowired
    ProductService ps;

    @Autowired
    CustomerService cs;

    @Autowired
    OrderService os;

    private Product prod;
    private Customer cust;

    ErrorController ec;



    @RequestMapping(value = "/showOrders.html")
    public String listOrders(Model model) {

        ArrayList<Order> orders = os.findAll();
        model.addAttribute("allOrders", orders);

        ArrayList<Customer> cust = cs.findAll();
        model.addAttribute("ordrs", cust);
        return "allOrders";
    }

    @RequestMapping(value = "/newOrder.html", method = RequestMethod.GET)
    public String addPerson(Model model) {
        ArrayList<Customer> customer = cs.findAll();
        ArrayList<Product> product = ps.findAll();

        Map<Long, String> customers = new LinkedHashMap<Long, String>();
        for (Customer c : customer) {
            customers.put(c.getcId(), c.getcName());

            model.addAttribute("customers", customers);

            Map<Long, String> products = new LinkedHashMap<Long, String>();
            for (Product p : product) {
                products.put(p.getpId(), p.getpDesc());

                model.addAttribute("products", products);
            }

        }
        Order o = new Order();

        model.addAttribute("orderList", o);

        return "addOrder";

    }

    @RequestMapping(value = "/newOrder.html", method = RequestMethod.POST)
    public String addOrderPost(@Valid @ModelAttribute("orderList") Order o, BindingResult result) {

        boolean qty = false;

        System.out.println("In order add");

        if (result.hasErrors()) {
            return "addOrder";
        }

        prod = ps.findOne(o.getProd().getpId());
        cust = cs.findOne(o.getCust().getcId());

        o.setProd(prod);
        prod.setQtyInStock(prod.getQtyInStock() - (o.getQty()));

        //if this happens the user should be redireccted with the following headings and error
        if (prod.getQtyInStock() < (o.getQty())) {
            ec.setHeader("Error creating the following order");
            ec.setError("Quantity to large: " + "Product stock" + prod.getQtyInStock());

            return "redirect:errorPage";
        }

        os.save(o);

        return "redirect:showOrders.html";

    }

    // Object that holds info related to the errors

        private static final String PATH = "/error";

        // adds ec object to the model and user is moved to the errorPage and error is
        // displayed
        @RequestMapping(value = PATH)
        public String errorPage(Model model) {

            System.out.println(ec.getHeader());
            System.out.println(ec.getError());

            model.addAttribute("exception", ec);

            return "errorPage";
        }
        @Override
        public String getErrorPath() {
            return PATH;
        }

}

Страница ошибки (JSP)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
 <h1>${exception.header}</h1>
  <h2>${exception.error}</h2>
</body>
</html>


1 Ответ

1 голос
/ 28 апреля 2020

Вам нужен обработчик исключений, который обрабатывает ваш тип исключения, или обработчик исключений, который обрабатывает исключения любого типа.

Я лично предпочитаю глобальные обработчики исключений приложений. Они создаются с помощью аннотации @ControllerAdvice:

@ControllerAdvice
public class ResponseExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ModelAndView handleAnyException(HttpServletRequest request, Exception e) {

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("your-error-page");

        return modelAndView;
    }
}

Этот обработчик исключений будет обрабатывать исключения любого типа в вашем приложении, поскольку он обрабатывает -> @ExceptionHandler (Exception.class) -> Exception.class.

Если вам нужно обработать определенные c исключения и предоставить страницы, отличные от тех, которые вам нужны, чтобы поместить указанный класс исключений c в @ ControllerAdvice.

Пример:

    @ExceptionHandler(CustomException.class)
    public ModelAndView handleAnyException(HttpServletRequest request, CustomException e) {

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("your-custom-page");

        return modelAndView;
    }

Хорошая статья об обработке исключений: https://www.baeldung.com/exception-handling-for-rest-with-spring

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...