// Path: xxl-conf-admin/src/main/java/com/xxl/conf/admin/core/util/JacksonUtil.java
// public class JacksonUtil {
// 	private static Logger logger = LoggerFactory.getLogger(JacksonUtil.class);
// 
// 	private final static ObjectMapper objectMapper = new ObjectMapper();
// 	public static ObjectMapper getInstance() {
// 		return objectMapper;
// 	}
// 
// 	/**
// 	 * bean、array、List、Map --> json
// 	 *
// 	 * @param obj
// 	 * @return json string
// 	 * @throws Exception
// 	 */
// 	public static String writeValueAsString(Object obj) {
// 		try {
// 			return getInstance().writeValueAsString(obj);
// 		} catch (JsonGenerationException e) {
// 			logger.error(e.getMessage(), e);
// 		} catch (JsonMappingException e) {
// 			logger.error(e.getMessage(), e);
// 		} catch (IOException e) {
// 			logger.error(e.getMessage(), e);
// 		}
// 		return null;
// 	}
// 
// 	/**
// 	 * string --> bean、Map、List(array)
// 	 *
// 	 * @param jsonStr
// 	 * @param clazz
// 	 * @return obj
// 	 * @throws Exception
// 	 */
// 	public static <T> T readValue(String jsonStr, Class<T> clazz) {
// 		try {
// 			return getInstance().readValue(jsonStr, clazz);
// 		} catch (JsonParseException e) {
// 			logger.error(e.getMessage(), e);
// 		} catch (JsonMappingException e) {
// 			logger.error(e.getMessage(), e);
// 		} catch (IOException e) {
// 			logger.error(e.getMessage(), e);
// 		}
// 		return null;
// 	}
// 	public static <T> T readValueRefer(String jsonStr, Class<T> clazz) {
// 		try {
// 			return getInstance().readValue(jsonStr, new TypeReference<T>() { });
// 		} catch (JsonParseException e) {
// 			logger.error(e.getMessage(), e);
// 		} catch (JsonMappingException e) {
// 			logger.error(e.getMessage(), e);
// 		} catch (IOException e) {
// 			logger.error(e.getMessage(), e);
// 		}
// 		return null;
// 	}
// 
// 	public static void main(String[] args) {
// 		try {
// 			Map<String, String> map = new HashMap<String, String>();
// 			map.put("aaa", "111");
// 			map.put("bbb", "222");
// 			String json = writeValueAsString(map);
// 			System.out.println(json);
// 			System.out.println(readValue(json, Map.class));
// 		} catch (Exception e) {
// 			logger.error(e.getMessage(), e);
// 		}
// 	}
// }
// 
// Path: xxl-conf-admin/src/main/java/com/xxl/conf/admin/core/util/ReturnT.java
// public class ReturnT<T> {
// 
// 	public static final int SUCCESS_CODE = 200;
// 	public static final int FAIL_CODE = 500;
// 
// 	public static final ReturnT<String> SUCCESS = new ReturnT<String>(null);
// 	public static final ReturnT<String> FAIL = new ReturnT<String>(FAIL_CODE, null);
// 
// 	private int code;
// 	private String msg;
// 	private T data;
// 
// 	public ReturnT(int code, String msg) {
// 		this.code = code;
// 		this.msg = msg;
// 	}
// 	public ReturnT(T data) {
// 		this.code = SUCCESS_CODE;
// 		this.data = data;
// 	}
// 
// 
// 	public int getCode() {
// 		return code;
// 	}
// 
// 	public void setCode(int code) {
// 		this.code = code;
// 	}
// 
// 	public String getMsg() {
// 		return msg;
// 	}
// 
// 	public void setMsg(String msg) {
// 		this.msg = msg;
// 	}
// 
// 	public T getData() {
// 		return data;
// 	}
// 
// 	public void setData(T data) {
// 		this.data = data;
// 	}
// 
// }


import com.xxl.conf.admin.core.util.JacksonUtil;
import com.xxl.conf.admin.core.util.ReturnT;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
package com.xxl.conf.admin.controller.resolver;



/**
 * common exception resolver
 *
 * 		1、@ControllerAdvice：扫描所有Controller；
 * 		2、@ControllerAdvice(annotations=RestController.class)：扫描指定注解类型的Controller；
 * 		3、@ControllerAdvice(basePackages={"com.aaa","com.bbb"})：扫描指定package下的Controller
 *
 * @author xuxueli 2016-1-6 19:22:18
 */
@Component
public class WebExceptionResolver implements HandlerExceptionResolver {
	private static transient Logger logger = LoggerFactory.getLogger(WebExceptionResolver.class);

	@Override
	public ModelAndView resolveException(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex) {

		logger.error("WebExceptionResolver:{}", ex);

		// if json
		boolean isJson = false;
		HandlerMethod method = (HandlerMethod)handler;
		ResponseBody responseBody = method.getMethodAnnotation(ResponseBody.class);
		if (responseBody != null) {
			isJson = true;
		}

		// error result
// Path: xxl-conf-admin/src/main/java/com/xxl/conf/admin/core/util/JacksonUtil.java
// public class JacksonUtil {
// 	private static Logger logger = LoggerFactory.getLogger(JacksonUtil.class);
// 
// 	private final static ObjectMapper objectMapper = new ObjectMapper();
// 	public static ObjectMapper getInstance() {
// 		return objectMapper;
// 	}
// 
// 	/**
// 	 * bean、array、List、Map --> json
// 	 *
// 	 * @param obj
// 	 * @return json string
// 	 * @throws Exception
// 	 */
// 	public static String writeValueAsString(Object obj) {
// 		try {
// 			return getInstance().writeValueAsString(obj);
// 		} catch (JsonGenerationException e) {
// 			logger.error(e.getMessage(), e);
// 		} catch (JsonMappingException e) {
// 			logger.error(e.getMessage(), e);
// 		} catch (IOException e) {
// 			logger.error(e.getMessage(), e);
// 		}
// 		return null;
// 	}
// 
// 	/**
// 	 * string --> bean、Map、List(array)
// 	 *
// 	 * @param jsonStr
// 	 * @param clazz
// 	 * @return obj
// 	 * @throws Exception
// 	 */
// 	public static <T> T readValue(String jsonStr, Class<T> clazz) {
// 		try {
// 			return getInstance().readValue(jsonStr, clazz);
// 		} catch (JsonParseException e) {
// 			logger.error(e.getMessage(), e);
// 		} catch (JsonMappingException e) {
// 			logger.error(e.getMessage(), e);
// 		} catch (IOException e) {
// 			logger.error(e.getMessage(), e);
// 		}
// 		return null;
// 	}
// 	public static <T> T readValueRefer(String jsonStr, Class<T> clazz) {
// 		try {
// 			return getInstance().readValue(jsonStr, new TypeReference<T>() { });
// 		} catch (JsonParseException e) {
// 			logger.error(e.getMessage(), e);
// 		} catch (JsonMappingException e) {
// 			logger.error(e.getMessage(), e);
// 		} catch (IOException e) {
// 			logger.error(e.getMessage(), e);
// 		}
// 		return null;
// 	}
// 
// 	public static void main(String[] args) {
// 		try {
// 			Map<String, String> map = new HashMap<String, String>();
// 			map.put("aaa", "111");
// 			map.put("bbb", "222");
// 			String json = writeValueAsString(map);
// 			System.out.println(json);
// 			System.out.println(readValue(json, Map.class));
// 		} catch (Exception e) {
// 			logger.error(e.getMessage(), e);
// 		}
// 	}
// }
// 
// Path: xxl-conf-admin/src/main/java/com/xxl/conf/admin/core/util/ReturnT.java
// public class ReturnT<T> {
// 
// 	public static final int SUCCESS_CODE = 200;
// 	public static final int FAIL_CODE = 500;
// 
// 	public static final ReturnT<String> SUCCESS = new ReturnT<String>(null);
// 	public static final ReturnT<String> FAIL = new ReturnT<String>(FAIL_CODE, null);
// 
// 	private int code;
// 	private String msg;
// 	private T data;
// 
// 	public ReturnT(int code, String msg) {
// 		this.code = code;
// 		this.msg = msg;
// 	}
// 	public ReturnT(T data) {
// 		this.code = SUCCESS_CODE;
// 		this.data = data;
// 	}
// 
// 
// 	public int getCode() {
// 		return code;
// 	}
// 
// 	public void setCode(int code) {
// 		this.code = code;
// 	}
// 
// 	public String getMsg() {
// 		return msg;
// 	}
// 
// 	public void setMsg(String msg) {
// 		this.msg = msg;
// 	}
// 
// 	public T getData() {
// 		return data;
// 	}
// 
// 	public void setData(T data) {
// 		this.data = data;
// 	}
// 
// }


// Path: xxl-conf-admin/src/main/java/com/xxl/conf/admin/controller/resolver/WebExceptionResolver.java
import com.xxl.conf.admin.core.util.JacksonUtil;
import com.xxl.conf.admin.core.util.ReturnT;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

package com.xxl.conf.admin.controller.resolver;



/**
 * common exception resolver
 *
 * 		1、@ControllerAdvice：扫描所有Controller；
 * 		2、@ControllerAdvice(annotations=RestController.class)：扫描指定注解类型的Controller；
 * 		3、@ControllerAdvice(basePackages={"com.aaa","com.bbb"})：扫描指定package下的Controller
 *
 * @author xuxueli 2016-1-6 19:22:18
 */
@Component
public class WebExceptionResolver implements HandlerExceptionResolver {
	private static transient Logger logger = LoggerFactory.getLogger(WebExceptionResolver.class);

	@Override
	public ModelAndView resolveException(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex) {

		logger.error("WebExceptionResolver:{}", ex);

		// if json
		boolean isJson = false;
		HandlerMethod method = (HandlerMethod)handler;
		ResponseBody responseBody = method.getMethodAnnotation(ResponseBody.class);
		if (responseBody != null) {
			isJson = true;
		}

		// error result
		ReturnT<String> errorResult = new ReturnT<String>(ReturnT.FAIL.getCode(), ex.toString().replaceAll("\n", "<br/>"));