получить объект modelandview в другом контроллере

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

Я обрабатываю исключение и добавляю их в пользовательский класс, затем в ModelAndView я добавляю это и передаю другому контроллеру с помощью перенаправления. И в этом контроллере мне нужен этот добавленный объект, но я не очень понимаю, как получить этот объект. Я пробовал некоторые трюки, но не добился успеха.

Код:

Класс ExceptionHandler:

@ControllerAdvice
public class DefaultExceptionHandler {

    @Autowired
    private CPro cPro;

    private static final Logger LOG = LoggerFactory.getLogger(DefaultExceptionHandler.class);

    @RequestMapping(produces = {MediaType.APPLICATION_JSON_VALUE})
    @ExceptionHandler(Exception.class)
    @ResponseStatus(value = INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ModelAndView handleException(Exception ex) {

        ModelAndView modelAndView = new ModelAndView("redirect:/");
        String exceptionType = ex.getClass().getSimpleName();
        DefaultExceptionHandler.LOG.error("Internal Server Exception", ex);
        ErrorResponse response = new ErrorResponse();
        if (ex.getCause() != null) {
            response.addSimpleError(exceptionType, ex.getCause().getMessage(), cPro.getProName());
        } else {
            response.addSimpleError(exceptionType, ex.getMessage(), cPro.getProName());
        }
        modelAndView.addObject("processingException", response);

        return modelAndView;
    }
}

мой домашний контроллер:

@RequestMapping(value = "/", method = RequestMethod.GET)
    public String getHomePage(@ModelAttribute("processingException") ErrorResponse errorResponse, Model model) {                

        // I want to get object data of processingException added in exception handler using ModelAndView
        model.addAttribute("processingException", errorResponse.getError() == null ? null : errorResponse);
        return "upscale"; //here upscale.html redirection       
    }

Кто-нибудь знает, как получить данные об этом объекте в моем контроллере?

Спасибо.


person user3145373 ツ    schedule 30.07.2015    source источник
comment
Вы должны понимать, что перенаправление вызывает новый цикл запроса/ответа. Атрибуты запроса, которые у вас были в исходном запросе, больше не присутствуют во втором. Используйте атрибуты перенаправления.   -  person Sotirios Delimanolis    schedule 30.07.2015
comment
@SotiriosDelimanolis: я опубликовал ответ на свой вопрос, скажите, лучше это или нет. Спасибо.   -  person user3145373 ツ    schedule 31.07.2015


Ответы (2)


После долгих поисков и поиска различных форумов и статей я нашел какое-то решение. Я объединил данные и код различных форумов, которые я выполнил.

Мы можем использовать FlashMap для этого. Просто получите контекст запроса и добавьте FlashMap, а также добавьте другие данные в FlashMap.

Код:

@ControllerAdvice
public class DefaultExceptionHandler {

    @Autowired
    private CPro cPro;

    private static final Logger LOG = LoggerFactory.getLogger(DefaultExceptionHandler.class);

    @ExceptionHandler(Exception.class)
    public String handleException(Exception ex, HttpServletRequest request) throws IOException {

        DefaultExceptionHandler.LOG.error("Internal Server Exception", ex);

        String exceptionType = ex.getClass().getSimpleName();

        ErrorResponse response = new ErrorResponse();

        if (ex.getCause() != null) {
            response.addError(exceptionType, ex.getCause().getMessage(), cPro.getProName());
        } else {
            response.addError(exceptionType, ex.getMessage(), cPro.getProName());
        }

        FlashMap outputFlashMap = RequestContextUtils.getOutputFlashMap(request);
        if (outputFlashMap != null) {
            outputFlashMap.put("processingException", response);
        }

        return "redirect:/";
    }
}

а с другой стороны, в контроллере используйте ModelAttribute для получения данных, отправленных методом обработчика исключений.

код:

@RequestMapping(value = "/", method = RequestMethod.GET)
public String getHomePage(Model model, @ModelAttribute("processingException") Object processingException) {                

    if (processingException instanceof ErrorResponse) {
        model.addAttribute("processingException", ((ErrorResponse) processingException).getError());
    } else {
        model.addAttribute("processingException", null);
    }
    return "upscale"; //here upscale.html redirection       
}

Ведь бинго.. Сделал свою работу.

Если у кого-то есть идея получше, то все равно добро пожаловать.

Спасибо, парни.

person user3145373 ツ    schedule 31.07.2015

Вы можете сделать обходной путь следующим образом:

public ModelAndView handleException(Exception ex, HttpServletRequest req) {
//...
ModelAndView modelAndView = new ModelAndView("forward:/");
//...
req.setAttribute("processingException", response);

Затем в вашем методе контроллера у вас есть доступ к HttpServletRequest и вы получаете атрибут (объект):

public String getHomePage(@ModelAttribute("processingException", HttpServletRequest req)
{
//....
req.getAttribute("processingException");
person sven.kwiotek    schedule 30.07.2015