关于springmvc的全局异常处理器,很多人都会想到@ExceptionHandler,但是如果项目既有@ResponBody返回json,还有返回xml的时候,默认ExceptionHandler返回的就是xml格式的响应;
为了解决这个问题,我们自定义一个类,继承ExceptionHandlerExceptionResolver 重写 afterPropertiesSet 方法,在这个方法中 加入可以返回json格式的消息转换器,比如MappingJackson2HttpMessageConverter;
代码如下:
@Component public class IHandlerExceptionResolver extends ExceptionHandlerExceptionResolver { @Override public void afterPropertiesSet() { List messageConverters=getMessageConverters(); messageConverters.add(new MappingJackson2HttpMessageConverter()); setMessageConverters(messageConverters); setOrder(2); super.afterPropertiesSet(); } }
在上述代码的基础上,就可以正常使用(指返回json格式的数据)下面全局异常处理器:
@Controller @ControllerAdvice public class ExHandler { @ExceptionHandler(Exception.class) @ResponseBody public ApiResult doEx(Exception ex){ return new ApiResult(500,ex.getMessage(),null); } }
// 基于java代码的配置,添加自定义异常处理器 @Configuration @EnableWebMvc public class MvcConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware { private ApplicationContext applicationContext; @Autowired private IHandlerExceptionResolver exceptionResolver;@Override public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) { super.configureHandlerExceptionResolvers(exceptionResolvers); exceptionResolvers.add(exceptionResolver); }