spring HandlerExceptionResolver将json对象写入httpservletresponse

时间:2018-05-10 17:18:44

标签: java spring spring-mvc

我正在处理负面案例,例如调用GET API,这实际上是一个POST调用。这使Spring发现405状态的方法未找到错误。

但我想要自己的例外,所以我添加了以下解析器:

 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 :(得分:0)

我不认为您应该使用该响应参数编写自己的输出。 Spring期望您的方法返回一个ModelAndView实例,您可以使用要发送给用户的数据(模型部分)填充该实例,以及将用于呈现它的视图资源的名称。然后,您还需要定义一个新的视图资源,它将仅从ModelAndView中的数据生成所需的JSON ...

答案 1 :(得分:0)

至于问题可以调试

的值
  

errorMessage = mapper.writeValueAsString(fault);

有更好的方法来执行此异常处理。

@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 来处理此问题,也可以尝试 情况。