package org.springboot.sample.interceptor;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* JSON请求响应错误消息处理
*
* @author 单红宇(365384722)
* @myblog http://blog.csdn.net/catoop/
* @create 2016年4月17日
*/
public class JsonErrorMsgInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
@SuppressWarnings("unchecked")
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
if(modelAndView == null)
return;
// 因为MappingJackson2JsonView默认会把BindingResult全部过滤掉。
// 所以我们要想将错误消息输出,要在这里自己处理好。
// 判断请求是否是.json、方法上是否有@ResponseBody注解,或者类上面是否有@RestController注解
// 表示为json请求
if (!request.getRequestURI().endsWith(".json")) {
HandlerMethod handlerMethod = (HandlerMethod)handler;
if(handlerMethod.getMethodAnnotation(ResponseBody.class) == null){
if(handlerMethod.getBeanType().getAnnotation(RestController.class) == null){
return;
}
}
}
Map<String, Object> modelMap = modelAndView.getModel();
if (modelMap != null) {
Map<String, String> errorMsg = null;
if(modelMap.containsKey("errorMsg")){
errorMsg = (Map<String, String>)modelMap.get("errorMsg");
}
if(errorMsg == null){
errorMsg = new HashMap<>();
modelMap.put("errorMsg", errorMsg);
}
for (Entry<String, Object> entry : modelMap.entrySet()) {
if (entry.getValue() instanceof BindingResult) {
BindingResult bindingResult = (BindingResult) entry.getValue();
if (bindingResult.hasErrors()) {
for (FieldError fieldError : bindingResult.getFieldErrors()) {
errorMsg.put(fieldError.getObjectName() + "." + fieldError.getField(),
fieldError.getDefaultMessage());
}
}
}
}
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}