package com.baidu.dsp.common.utils;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.NoSuchMessageException;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.servlet.ModelAndView;
import com.baidu.dsp.common.constant.ErrorCode;
import com.baidu.dsp.common.context.ContextReader;
import com.baidu.dsp.common.vo.JsonObjectBase;
import com.baidu.dsp.common.vo.JsonObjectError;
import com.baidu.dsp.common.vo.JsonObjectUtils;
/**
* 参数错误的工具
*
* @author liaoqiqi
* @version 2014-3-3
*/
@Component
public class ParamValidateUtils {
protected static final Logger LOG = LoggerFactory.getLogger(ParamValidateUtils.class);
private static ContextReader contextReader;
@Autowired(required = true)
public ParamValidateUtils(@Qualifier("contextReaderImpl") ContextReader contextReader) {
ParamValidateUtils.contextReader = contextReader;
}
/**
* 参数错误
*
* @param paramErrors
*
* @return
*/
private static ModelAndView paramError(Map<String, String> paramErrors, Map<String, Object[]> paramArgusErrors,
ErrorCode errorCode) {
JsonObjectBase jsonObject = JsonObjectUtils.buildFieldError(paramErrors, paramArgusErrors, errorCode);
return JsonObjectUtils.JsonObjectError2ModelView((JsonObjectError) jsonObject);
}
/**
* 从bindException中获取到参数错误类型,参数错误
*/
public static ModelAndView getParamErrors(BindException be) {
// 构造error的映射
Map<String, String> paramErrors = new HashMap<String, String>();
Map<String, Object[]> paramArgusErrors = new HashMap<String, Object[]>();
for (Object error : be.getAllErrors()) {
if (error instanceof FieldError) {
FieldError fe = (FieldError) error;
String field = fe.getField();
// 默认的message
String message = fe.getDefaultMessage();
try {
contextReader.getMessage(message, fe.getArguments());
} catch (NoSuchMessageException e) {
// 如果有code,则从前往后遍历Code(特殊到一般),修改message为code所对应
for (int i = fe.getCodes().length - 1; i >= 0; i--) {
try {
String code = fe.getCodes()[i];
String info = contextReader.getMessage(code, fe.getArguments());
LOG.debug(code + "\t" + info);
message = code;
} catch (NoSuchMessageException e2) {
LOG.debug("");
}
}
}
// 最终的消息
paramErrors.put(field, message);
paramArgusErrors.put(field, fe.getArguments());
}
}
return ParamValidateUtils.paramError(paramErrors, paramArgusErrors, ErrorCode.FIELD_ERROR);
}
}