94 lines
3.1 KiB
Java
94 lines
3.1 KiB
Java
/**
|
||
* @Title: RestServiceExceptionHandler.java
|
||
* @Package com.nis.restful
|
||
* @Description: TODO(用一句话描述该文件做什么)
|
||
* @author (darnell)
|
||
* @date 2016年8月24日 上午11:31:47
|
||
* @version V1.0
|
||
*/
|
||
package com.nis.restful;
|
||
|
||
import java.io.IOException;
|
||
|
||
import javax.servlet.http.HttpServletRequest;
|
||
import javax.servlet.http.HttpServletResponse;
|
||
|
||
import org.slf4j.Logger;
|
||
import org.slf4j.LoggerFactory;
|
||
import org.springframework.beans.factory.annotation.Autowired;
|
||
import org.springframework.web.servlet.ModelAndView;
|
||
import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver;
|
||
|
||
import com.fasterxml.jackson.core.JsonEncoding;
|
||
import com.fasterxml.jackson.core.JsonGenerationException;
|
||
import com.fasterxml.jackson.core.JsonGenerator;
|
||
import com.fasterxml.jackson.databind.JsonMappingException;
|
||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||
|
||
/**
|
||
* @ClassName: RestServiceExceptionHandler
|
||
* @Description: TODO(rest异常处理,需要判断是否为rest异常,如果不是,则交给正常页面异常处理,否则抛出json格式错误.判断是否rest异常需要具体项目具体实现,默认统一为true)
|
||
* @author (darnell)
|
||
* @date 2016年8月24日 上午11:31:47
|
||
* @version V1.0
|
||
*/
|
||
public class RestServiceExceptionHandler extends DefaultHandlerExceptionResolver{
|
||
|
||
protected static final Logger LOGGER = LoggerFactory.getLogger(RestServiceExceptionHandler.class);
|
||
|
||
/**
|
||
* 通过xml文件配置,可能存在自定义的异常类型
|
||
*/
|
||
private RestErrorResolver errorResolver;
|
||
|
||
@Autowired
|
||
private RestConverter<?> errorConverter; //错误信息转换器
|
||
|
||
/**
|
||
* 确认是否rest服务方法,需要子类重写
|
||
* 如果不是则不做处理,直接交给父类处理
|
||
* @param request
|
||
* @return 是否为rest服务
|
||
*/
|
||
public boolean isRestServiceException(HttpServletRequest request){
|
||
return true;
|
||
}
|
||
|
||
@Override
|
||
protected ModelAndView doResolveException(HttpServletRequest request,
|
||
HttpServletResponse response, Object handler, Exception ex) {
|
||
if (isRestServiceException(request)) {
|
||
RestResult error = errorResolver.resolveError(request, handler, ex);
|
||
response.setStatus(error.getStatus().value());
|
||
response.setCharacterEncoding("UTF-8");
|
||
response.setContentType("application/json");
|
||
ObjectMapper mapper = new ObjectMapper();
|
||
try {
|
||
JsonGenerator jsonGenerator = mapper.getFactory()
|
||
.createGenerator(response.getOutputStream(),
|
||
JsonEncoding.UTF8);
|
||
mapper.writeValue(jsonGenerator, errorConverter.convert(error));
|
||
} catch (JsonGenerationException e) {
|
||
e.printStackTrace();
|
||
} catch (JsonMappingException e) {
|
||
e.printStackTrace();
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
return new ModelAndView();
|
||
} else {
|
||
return super.doResolveException(request, response, handler, ex);
|
||
}
|
||
|
||
}
|
||
|
||
public RestErrorResolver getErrorResolver() {
|
||
return errorResolver;
|
||
}
|
||
|
||
public void setErrorResolver(RestErrorResolver errorResolver) {
|
||
this.errorResolver = errorResolver;
|
||
}
|
||
|
||
}
|