Spring HandlerExceptionResolver записывает объект json в httpservletresponse - PullRequest
0 голосов
/ 10 мая 2018

Я занимаюсь негативными случаями, такими как вызов GET API, который на самом деле является вызовом POST. Это дает метод «Не найден» с состоянием 405 к Spring.

Но мне нужно собственное исключение, поэтому я добавил следующий распознаватель:

 public class HandlerExceptionResolver 
 implements org.springframework.web.servlet.HandlerExceptionResolver {
    protected final Log logger = LogFactory.getLog(this.getClass());

    @Override
    public ModelAndView resolveException(
    HttpServletRequest request, HttpServletResponse response, 
    Object handler,Exception exception) {
        logger.trace("-------------doResolveException-------------");
        System.out.println("-------------doResolveException-------------");

        if(exception instanceof HttpRequestMethodNotSupportedException) {
            Fault fault = new Fault();
            ObjectMapper mapper = new ObjectMapper();
            mapper.setSerializationInclusion(Include.NON_NULL);
            String errorMessage;
            try {
                errorMessage = mapper.writeValueAsString(fault);

                response.setStatus(405);
                response.setContentType("application/json");

                response.getWriter().println(errorMessage);
                response.getWriter().flush();
            }
                catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        return null;
    }

Но это не записывает JSON в ответ.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Что касается проблем, вы можете отладить значение

errorMessage = mapper.writeValueAsString (ошибка);

есть лучший способчтобы сделать эту обработку исключений.

@ExceptionHandler(HandlerExceptionResolver.class)
    public ModelAndView handleEmployeeNotFoundException(HttpServletRequest request, Exception ex){
        logger.error("Requested URL="+request.getRequestURL());
        logger.error("Exception Raised="+ex);

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("exception", ex);
        modelAndView.addObject("url", request.getRequestURL());

        modelAndView.setViewName("error");
        return modelAndView;
    }   

Вы можете попробовать также, если вы хотите использовать @ ExceptionHandler для обработки этой ситуации.

0 голосов
/ 10 мая 2018

Не думаю, что вы должны писать свой вывод с использованием этого параметра ответа. Spring ожидает, что ваш метод вернет экземпляр ModelAndView, который вы можете заполнить данными, которые вы хотите отправить пользователю (часть модели), и именем ресурса представления, который будет использоваться для его визуализации. Затем вам также потребуется определить новый ресурс представления, который будет просто генерировать нужный вам JSON из данных в ModelAndView ...

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