春季内部异常的自定义json响应

Posted

技术标签:

【中文标题】春季内部异常的自定义json响应【英文标题】:Custom json response for internal exception in spring 【发布时间】:2015-01-07 15:52:00 【问题描述】:

在 Spring 中实现全局异常处理程序时,我注意到在无法识别 Accept 标头的情况下,Spring 会抛出它自己的内部错误。我需要的是返回一个自定义的 JSON 错误结构。适用于特定于应用程序的异常,但对于 Spring HttpMediaTypeNotAcceptableException 完全失败。

当我尝试请求带有不正确 Accept 标头的页面时,此代码告诉我“无法调用 @ExceptionHandler 方法:public java.util.Map RestExceptionHandler.springMalformedAcceptHeaderException()”。还有其他方法可以为 Spring 内部异常返回自定义 JSON 吗?

@ControllerAdvice
public class RestExceptionHandler 

    @ExceptionHandler(value = HttpMediaTypeNotAcceptableException.class)
    @ResponseBody
    public Map<String, String> springMalformedAcceptHeaderException() 

         Map<String, String> test = new HashMap<String, String>();
         test.put("test", "test");
         return test;
     
 

【问题讨论】:

【参考方案1】:

最终发现唯一的办法就是手动进行 json 映射。

@ExceptionHandler(value = HttpMediaTypeNotAcceptableException.class)
@ResponseBody
public String springMalformedAcceptHeaderException(HttpServletResponse response) 
    // populate errorObj, set response headers, etc
    ObjectWriter jsonWriter = new ObjectMapper().writer();
    try 
        return  jsonWriter.writeValueAsString(errorObj);
     catch(Exception e)
    return "Whatever";

【讨论】:

以上是关于春季内部异常的自定义json响应的主要内容,如果未能解决你的问题,请参考以下文章

NoHandlerFoundException 的自定义异常处理程序在没有 @EnableWebMvc 的情况下不起作用

春季/安全中的自定义会话超时

错误 json 的自定义错误响应。点网核心 Web API

Spring RestTemplate 响应中从 JSON 到 Java/POJO 的自定义映射

*某些* iOS 8 版本中的自定义导航项的内部不一致异常

处理来自 PHPUnit (Laravel 5.2) 的自定义异常