All Downloads are FREE. Search and download functionalities are using the official Maven repository.

coo.mvc.api.ApiUtils Maven / Gradle / Ivy

package coo.mvc.api;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import coo.base.util.StringUtils;
import coo.core.message.MessageSource;
import coo.core.util.SpringUtils;

/**
 * API工具类。
 */
public class ApiUtils {
	private static final Logger log = LoggerFactory.getLogger(ApiUtils.class);
	private static final ObjectMapper mapper = new ObjectMapper();

	/**
	 * 抛出API异常。
	 * 
	 * @param code
	 *            异常编码
	 * @param vars
	 *            异常信息变量
	 */
	public static void thrown(String code, Object... vars) {
		throw newExcepiton(code, vars);
	}

	/**
	 * 生成API异常。
	 * 
	 * @param code
	 *            异常编码
	 * @param vars
	 *            异常信息变量
	 * @return 返回生成的API异常。
	 */
	public static ApiException newExcepiton(String code, Object... vars) {
		MessageSource messageSource = SpringUtils.getBean("messageSource");
		return new ApiException(code, messageSource.get(code, vars));
	}

	/**
	 * 生成失败的响应对象。
	 * 
	 * @return 返回失败的响应对象。
	 */
	public static ApiReply newErrorReply() {
		return new ApiReply(ApiCode.FAILURE, "发生未知异常。");
	}

	/**
	 * 生成API异常响应对象。
	 * 
	 * @param ex
	 *            API异常
	 * @return 返回API异常响应对象。
	 */
	public static ApiReply newApiExceptionReply(ApiException ex) {
		return new ApiReply(ex.getCode(), ex.getMsg());
	}

	/**
	 * 生成参数验证异常响应对象。
	 * 
	 * @param ex
	 *            参数验证异常
	 * @return 返回参数验证异常响应对象。
	 */
	public static ApiReply newBindExceptionReply(BindException ex) {
		List errorMsgs = new ArrayList<>();
		List errors = ((BindException) ex).getBindingResult()
				.getAllErrors();
		for (ObjectError error : errors) {
			errorMsgs.add(error.getDefaultMessage());
		}
		return new ApiReply(ApiCode.PARAMS_ERROR, StringUtils.join(errorMsgs,
				"|"));
	}

	/**
	 * 从数据模型中获取API响应对象。
	 * 
	 * @param modelMap
	 *            数据模型
	 * @return 返回API响应对象。
	 */
	public static ApiReply getReply(ModelMap modelMap) {
		for (Object model : modelMap.values()) {
			if (model instanceof ApiReply) {
				return (ApiReply) model;
			}
		}
		return null;
	}

	/**
	 * 记录API调用日志。
	 * 
	 * @param request
	 *            请求对象
	 * @param reply
	 *            响应对象
	 */
	public static void log(HttpServletRequest request, ApiReply reply) {
		String result = reply.getCode().equals(ApiCode.SUCCESS) ? "成功" : "失败";
		String msg = String.format("[%s][%s][请求:%s][响应:%s]",
				request.getRequestURI(), result, getQueryJson(request),
				getReplyJson(reply));
		log.info(msg);
	}

	/**
	 * 记录API异常日志。
	 * 
	 * @param request
	 *            请求对象
	 * @param reply
	 *            响应对象
	 * @param ex
	 *            异常
	 */
	public static void log(HttpServletRequest request, ApiReply reply,
			Exception ex) {
		String msg = String.format("[%s][失败][请求:%s][响应:%s]",
				request.getRequestURI(), getQueryJson(request),
				getReplyJson(reply));
		if (ex instanceof ApiException) {
			log.error(msg);
		} else {
			log.error(msg, ex);
		}
	}

	/**
	 * 获取请求对象的JSON字符串,用于日志记录。
	 * 
	 * @param request
	 *            请求对象
	 * @return 返回请求对象的JSON字符串。
	 */
	private static String getQueryJson(HttpServletRequest request) {
		try {
			return mapper.writeValueAsString(request.getParameterMap());
		} catch (JsonProcessingException e) {
			return e.getMessage();
		}
	}

	/**
	 * 获取响应对象的JSON字符串,用于日志记录。
	 * 
	 * @param reply
	 *            响应对象。
	 * @return 返回响应对象的JSON字符串。
	 */
	private static String getReplyJson(ApiReply reply) {
		try {
			return mapper.writeValueAsString(reply);
		} catch (JsonProcessingException e) {
			return e.getMessage();
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy