我正在处理负面案例,例如调用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写入响应。
答案 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 来处理此问题,也可以尝试 情况。