Commit d9c5bb47 authored by liqin's avatar liqin 💬

bug fixed

parent 27336103
package cn.wisenergy.datastation.common.core.utils.exception;
/**
* 响应编码
*/
public enum RESPONSE_CODE_ENUM {
/* ******************** 系统异常 ********************* */
PARAM_NOT_VALID("400", "请求的参数不合法"),
RESOURCE_NOT_FOUND("404", "请求的资源不存在"),
METHOD_NOT_SUPPORTED("405", "不支持的请求方法"),
MEDIA_TYPE_NOT_ACCEPT("406", "无法接受请求中的媒体类型"),
MEDIA_TYPE_NOT_SUPPORTED("415", "不支持的媒体类型"),
SERVER_ERROR("500", "服务异常"),
/* ******************** 业务自定义异常 **************** */
REQUEST_PARAMS_ERROR("1001", "参数异常"),
GAIN_DATA_FAIL("1003", "获取数据失败"),
UPLOAD_FAILURE("1005", "上传失败"),
AZKABAN_PROJECT_REPEAT("1006", "工程名重复"),
HBASE_IOEXCEPTION("1008", "连接hbase异常"),
CREATE_FLOW_PROJECT_ERROR("1009", "业务流程名称重复"),
CREATE_FLOW_NODE_ERROR("1010", "业务节点名称重复"),
FLUME_AGENT_ERROR("1011", "agent名称重复"),
FLUME_AGENT_RUNNING("1012", "agent正在运行,不可操作"),
PARAMETER_PARSING_FAILED("1013", "参数解析失败"),
EMPTY_NODE_LIST_RUN_FAILED("1014", "节点集合为空,运行失败"),
FLOW_RESOURCE_REPEAT("1015", "目录下,有重名资源"),
FILE_SYSTEM_FILE_NOEXIST("1016", "目录不存在"),
FILE_SYSTEM_FILE_EXCEPTION("1017", "访问异常"),
EMPTY_NODE_RUN_FAILED("1018", "-节点内容为空"),
EMPTY_NODE_LIST_SAVE_FAILED("1019", "节点集合为空,保存失败"),
CANCEL_FLOW_CHAIN_FAILED("1020", "正在更新工作流程链,请稍后刷新页面"),
TEMPORARY_QUERY_NAME_REPEAT("1021", "hive查询任务重名"),
DATA_SYNC_NODE_CHECK_ERROR("1022", "数据同步节点配置错误"),
HIVE_UPLOAD_FILE_INCORRECT("1028", "文件类型不支持"),
SCHEDULE_FLOW_EXEC_REPEAT("1029", "业务流程的定时任务启动重复"),
NAME_REPEAT("1030", "名称重复"),
CODE_REPEAT("1031", "编码重复"),
MODEL_RELEASE_ERROR("1032", "已为发布状态,不能发布"),
MODEL_OFFLINE_ERROR("1033", "被占用,不能下线"),
MODEL_DELETE_ERROR("1034", "发布状态,不能删除"),
DIMENSION_TABLE_DATABASE_INFO_ERROR("1035", "维度表数据源信息是必须的"),
DIMENSION_TABLE_CREATE_TABLE_ERROR("1036", "维度表创建失败"),
FACT_ATTRIBUTES_CHECK_ERROR("1037", "事实表属性必须包含时间数据类型"),
FACT_TABLES_CREATE_TABLE_ERROR("1038", "事实表创建失败"),
FACT_TABLES_DATABASE_INFO_ERROR("1039", "事实表数据源信息是必须的"),
AGGREGATION_TABLE_DATABASE_INFO_ERROR("1040", "汇总表数据源信息是必须的"),
AGGREGATION_TABLE_CREATE_TABLE_ERROR("1041", "汇总表创建失败"),
AGGREGATION_ATTRIBUTES_CHECK_ERROR("1042", "汇总表必须配置时间周期和指标"),
MODEL_CREATE_ERROR("1043", "创建失败"),
MODEL_OFFLINE_STATUS_ERROR("1044", "当前状态为非发布状态,不允许下线"),
FIELD_NAME_ID_REPEAT_ERROR("1045", "字段名称id不允许重复"),
ASSET_LABEL_DELETE_ERROR("1046", "标签为引用状态,不能删除"),
QUALITY_JOB_NOT_EXIST("1047", "质量作业不存在"),
SYSTEM_TEMPLATE_NOT_OPERATIONAL_ERROR("1048", "系统模板不可操作"),
QUALITY_JOB_RUNNING_NOT_DELETE("1049", "质量作业正在运行,不能删除"),
QUALITY_RULE_SQL_SEMANTIC_VERIFICATION_ERROR("1050", "语义校验失败,请检查。"),
QUALITY_JOB_PERIOD_CRON_NOT_EXIST("1051", "CRON表达式不存在"),
QUALITY_JOB_RUN_TASK_NOT_FIND("1052", "找不到要停止的质量作业任务"),
OUTPUT_SHOW_WITH_SQL_NOT_MATCH_ERROR("1053", "输出结果说明与定义关系不匹配"),
LACK_A_PRIMARY_KEY_ERROR("1054", "至少包含一个主键属性"),
QUALITY_JOB_RUN_ERROR("1055", "启动质量作业失败,请检查质量作业参数..."),
ILLEGAL_OPERATION("1400", "违规操作"),
BUSINESS_OBJECT_NAME_REGEX_CHECK_ERROR("1500", "只允许除右斜杠、<、>、/外的字符"),
/* ******************** 登录权限 **************** */
USER_NAME_REPEAT("1101", "账户已存在"),
LOGIN_INCORRECT("1102", "登录异常"),
LOGIN_NOT_EXISTS("1103", "账户不存在"),
LOGIN_PWD_INCORRECT("1104", "账户或密码不正确"),
NOT_LOGIN_ERROR("1105", "重新登录"),
OLD_PASSWORD_INCORRECT("1106", "旧密码不正确"),
ACCOUNT_HAS_BEEN_DISABLED("1107", "此账号已被禁用"),
ACCOUNT_IS_LOCKED("1108", "此账号已被锁定,请稍后再试"),
ACCOUNT_AUTHENTICATION_FAILED("1109", "账号认证失败"),
UNAUTHORIZED("1110", "权限不足"),
ROLE_CODE_REPEAT("1111", "角色编码已存在"),
SYS_ROLE_DELETE_FAIL("1112", "系统角色不允许删除"),
SYS_MENU_DELETE_FAIL("1113", "还存在子菜单,不能直接删除"),
/* ******************** 操作失败 **************** */
REQUEST_FAIL("1100", "操作失败"),
/* ******************** 操作成功 **************** */
REQUEST_SUCCESS("200", "操作成功");
// 错误编码
private String code;
// 错误信息
private String msg;
// 相应编码有参构造函数
RESPONSE_CODE_ENUM(String code, String msg) {
this.code = code;
this.msg = msg;
}
/**
* 获取编码
*/
public String getCode() {
return code;
}
/**
* 设置编码
*/
public void setCode(String code) {
this.code = code;
}
/**
* 获取编码信息
*/
public String getMsg() {
return msg;
}
/**
* 设置编码信息
*/
public void setMsg(String msg) {
this.msg = msg;
}
}
package cn.wisenergy.datastation.common.core.enums;
/**
* 响应结果信息枚举
*
* @author mxy
* @date 2020/3/30
*/
public enum RESULT_INFO_ENUM {
RESULT_CODE("code", "响应码key"),
RESULT_MSG("msg", "响应信息key"),
RESULT_BODY("body", "响应传输信息key");
/**
* 响应结果key
*/
private String key;
/**
* 响应结果名称
*/
private String name;
RESULT_INFO_ENUM(String key, String name) {
this.key = key;
this.name = name;
}
/**
* 获取响应结果key
*/
public String getKey() {
return key;
}
/**
* 获取响应结果name
*/
public String getName() {
return name;
}
}
package cn.wisenergy.chnmuseum.party.common.mvc;
import com.google.common.base.Splitter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.shiro.authz.UnauthenticatedException;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.beans.ConversionNotSupportedException;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.http.converter.HttpMessageConversionException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.List;
import java.util.stream.Collectors;
/**
* 全局异常处理
*
* @author mxy
* @date 2019/8/1
*/
@Slf4j
@RestControllerAdvice
public class GlobalExceptionAdvisor {
/**
* 捕获全局异常,处理所有不可知的异常
*
* @param exception 异常对象
*/
@ExceptionHandler(Exception.class)
public Object handleException(Exception exception) {
log.error("\r\n ************** 操作出现异常:{}", ExceptionUtils.getStackTrace(exception));
Class<?> eClass = exception.getClass();
HttpResult httpResult = new HttpResult();
if (eClass.equals(HttpRequestMethodNotSupportedException.class)) {
addResCodeToMap(RESPONSE_CODE_ENUM.METHOD_NOT_SUPPORTED, httpResult);
} else if (eClass.equals(HttpMediaTypeNotAcceptableException.class)) {
addResCodeToMap(RESPONSE_CODE_ENUM.MEDIA_TYPE_NOT_ACCEPT, httpResult);
} else if (eClass.equals(HttpMediaTypeNotSupportedException.class)) {
addResCodeToMap(RESPONSE_CODE_ENUM.MEDIA_TYPE_NOT_SUPPORTED, httpResult);
} else if (eClass.equals(ConversionNotSupportedException.class)) {
addResCodeToMap(RESPONSE_CODE_ENUM.SERVER_ERROR, httpResult);
} else if (eClass.equals(HttpMessageNotWritableException.class)) {
addResCodeToMap(RESPONSE_CODE_ENUM.SERVER_ERROR, httpResult);
} else {
addResCodeToMap(RESPONSE_CODE_ENUM.SERVER_ERROR, httpResult);
}
return httpResult;
}
@ExceptionHandler(BindException.class)
@ResponseBody
public HttpResult handle(BindException ex) {
String message = ex.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(" \n "));
// BindingResult bindingResult = ex.getBindingResult();
// StringBuilder errMsg = new StringBuilder(bindingResult.getFieldErrors().size() * 16);
// errMsg.append("Invalid request:");
// for (int i = 0; i < bindingResult.getFieldErrors().size(); i++) {
// if (i > 0) {
// errMsg.append(",");
// }
// FieldError error = bindingResult.getFieldErrors().get(i);
// errMsg.append(error.getField()).append(":").append(error.getDefaultMessage());
// }
return new HttpResult(400, message);
//throw new InterfaceException(RESPONSE_CODE_ENUM.PARAM_NOT_VALID.getCode(), errMsg.toString());
}
//处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
public String constraintViolationExceptionHandler(ConstraintViolationException e) {
return e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
}
/**
* 处理请求参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常。
*
* @param exception 错误信息集合
* @return 错误信息
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public HttpResult validationBodyException(MethodArgumentNotValidException exception) {
BindingResult result = exception.getBindingResult();
String msg = null;
if (result.hasErrors()) {
List<ObjectError> errors = result.getAllErrors();
for (ObjectError objectError : errors) {
FieldError fieldError = (FieldError) objectError;
if (fieldError.getDefaultMessage() != null) {
log.info("Data check failure : object{" + fieldError.getObjectName() + "},field{" + fieldError.getField() +
"},errorMessage{" + fieldError.getDefaultMessage() + "}");
msg = fieldError.getDefaultMessage();
}
}
}
return new HttpResult(400, msg);
}
@ExceptionHandler(DataAccessException.class)
public HttpResult dataAccessException(DataAccessException exception) {
return new HttpResult(400, exception.getLocalizedMessage());
}
@ExceptionHandler(DuplicateKeyException.class)
@ResponseBody
public HttpResult duplicateKeyException(DuplicateKeyException e) {
String localizedMessage = e.getLocalizedMessage();
String message = Splitter.on(System.lineSeparator()).trimResults().splitToList(localizedMessage).get(1);
String substring = message.substring(message.indexOf("Exception:"));
if (substring.toUpperCase().contains("NAME")) {
return new HttpResult(400, "名称已存在");
} else if (substring.toUpperCase().contains("CODE")) {
return new HttpResult(400, "编码已存在");
}
return new HttpResult(400, message);
}
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
@ResponseBody
public HttpResult sqlIntegrityConstraintViolationException(SQLIntegrityConstraintViolationException e) {
String localizedMessage = e.getLocalizedMessage();
String message = Splitter.on(System.lineSeparator()).trimResults().splitToList(localizedMessage).get(1);
String substring = message.substring(message.indexOf("Exception:"));
if (substring.toUpperCase().contains("NAME")) {
return new HttpResult(400, "名称已存在");
} else if (substring.toUpperCase().contains("CODE")) {
return new HttpResult(400, "编码已存在");
}
return new HttpResult(400, message);
}
/**
* 参数类型转换错误
*
* @param exception 错误
* @return 错误信息
*/
@ExceptionHandler(HttpMessageConversionException.class)
public HttpResult httpMessageConversionException(HttpMessageConversionException exception) {
log.error(exception.getCause().getLocalizedMessage());
return new HttpResult(400, exception.getCause().getLocalizedMessage());
}
/**
* 捕获业务异常
*
* @param exception 自定义接口异常类
* @return 返回的异常信息map
*/
@ExceptionHandler(InterfaceException.class)
public HttpResult handleInterfaceException(InterfaceException exception) {
HttpResult httpResult = new HttpResult();
httpResult.setCode(Integer.parseInt(exception.getErrorCode()));
httpResult.setMsg(exception.getErrorMsg());
return httpResult;
}
/**
* 捕获Shiro无权限异常 未授权异常
*
* @param exception 无权限异常
* @return 返回的异常信息map
*/
@ExceptionHandler(UnauthorizedException.class)
public Object handleUnauthorizedException(UnauthorizedException exception) {
HttpResult httpResult = new HttpResult();
// 无权限
addResCodeToMap(RESPONSE_CODE_ENUM.UNAUTHORIZED, httpResult);
return httpResult;
}
/**
* 捕获Shiro无权限异常 未认证异常
*
* @param exception 无权限异常
* @return 返回的异常信息map
*/
@ExceptionHandler(UnauthenticatedException.class)
public Object handleUnauthenticatedException(UnauthenticatedException exception) {
HttpResult httpResult = new HttpResult();
// 无权限
addResCodeToMap(RESPONSE_CODE_ENUM.UNAUTHORIZED, httpResult);
return httpResult;
}
/**
* 添加异常信息到map中
*
* @param responseCodeEnum 错误响应编码枚举类对象
* @param httpResult 响应对象
*/
private void addResCodeToMap(RESPONSE_CODE_ENUM responseCodeEnum, HttpResult httpResult) {
httpResult.setCode(Integer.parseInt(responseCodeEnum.getCode()));
httpResult.setMsg(responseCodeEnum.getMsg());
}
}
package cn.wisenergy.chnmuseum.party.common.mvc;
public class HttpResult {
// 响应的状态码
private int code;
// 响应的响应信息
private String msg;
// 响应的响应体
private Object body;
public HttpResult() {
}
public HttpResult(int code, String msg) {
this.code = code;
this.msg = msg;
}
public HttpResult(int code, Object body) {
this.code = code;
this.body = body;
}
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 Object getBody() {
return body;
}
public void setBody(Object body) {
this.body = body;
}
@Override
public String toString() {
return "{" +
"\"code\":" + code +
", \"msg\":" + "\"" + msg + "\"" +
", \"body\":" + body +
'}';
}
}
package cn.wisenergy.chnmuseum.party.common.mvc;
/**
* 自定义接口异常对象
*/
public class InterfaceException extends RuntimeException {
private static final long serialVersionUID = -854533489101542484L;
// 错误编码
private String errorCode;
// 错误编码信息
private String errorMsg;
/**
* 应用接口有参构造函数
*
* @param errorCode 错误编码
* @param errorMsg 错误信息
*/
public InterfaceException(String errorCode, String errorMsg) {
super("errorCode:" + errorCode + " errorMsg:" + errorMsg);
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
/**
* 应用接口有参构造函数
*
* @param responseCode 响应编码枚举
*/
public InterfaceException(RESPONSE_CODE_ENUM responseCode) {
super("errorCode:" + responseCode.getCode() + " errorMsg:" + responseCode.getMsg());
this.errorCode = responseCode.getCode();
this.errorMsg = responseCode.getMsg();
}
/**
* 获取错误编码
*/
public String getErrorCode() {
return errorCode;
}
/**
* 设置错误编码
*/
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
/**
* 获取异常编码
*/
public String getErrorMsg() {
return errorMsg;
}
/**
* 设置异常编码
*/
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
package cn.wisenergy.chnmuseum.party.common.mvc;
/**
* 响应编码
*/
public enum RESPONSE_CODE_ENUM {
/* ******************** 系统异常 ********************* */
PARAM_NOT_VALID("400", "请求的参数不合法"),
RESOURCE_NOT_FOUND("404", "请求的资源不存在"),
METHOD_NOT_SUPPORTED("405", "不支持的请求方法"),
MEDIA_TYPE_NOT_ACCEPT("406", "无法接受请求中的媒体类型"),
MEDIA_TYPE_NOT_SUPPORTED("415", "不支持的媒体类型"),
SERVER_ERROR("500", "服务异常"),
/* ******************** 业务自定义异常 **************** */
REQUEST_PARAMS_ERROR("1001", "参数异常"),
GAIN_DATA_FAIL("1003", "获取数据失败"),
UPLOAD_FAILURE("1005", "上传失败"),
AZKABAN_PROJECT_REPEAT("1006", "工程名重复"),
HBASE_IOEXCEPTION("1008", "连接hbase异常"),
CREATE_FLOW_PROJECT_ERROR("1009", "业务流程名称重复"),
CREATE_FLOW_NODE_ERROR("1010", "业务节点名称重复"),
FLUME_AGENT_ERROR("1011", "agent名称重复"),
FLUME_AGENT_RUNNING("1012", "agent正在运行,不可操作"),
PARAMETER_PARSING_FAILED("1013", "参数解析失败"),
EMPTY_NODE_LIST_RUN_FAILED("1014", "节点集合为空,运行失败"),
FLOW_RESOURCE_REPEAT("1015", "目录下,有重名资源"),
FILE_SYSTEM_FILE_NOEXIST("1016", "目录不存在"),
FILE_SYSTEM_FILE_EXCEPTION("1017", "访问异常"),
EMPTY_NODE_RUN_FAILED("1018", "-节点内容为空"),
EMPTY_NODE_LIST_SAVE_FAILED("1019", "节点集合为空,保存失败"),
CANCEL_FLOW_CHAIN_FAILED("1020", "正在更新工作流程链,请稍后刷新页面"),
TEMPORARY_QUERY_NAME_REPEAT("1021", "hive查询任务重名"),
DATA_SYNC_NODE_CHECK_ERROR("1022", "数据同步节点配置错误"),
HIVE_UPLOAD_FILE_INCORRECT("1028", "文件类型不支持"),
SCHEDULE_FLOW_EXEC_REPEAT("1029", "业务流程的定时任务启动重复"),
NAME_REPEAT("1030", "名称重复"),
CODE_REPEAT("1031", "编码重复"),
MODEL_RELEASE_ERROR("1032", "已为发布状态,不能发布"),
MODEL_OFFLINE_ERROR("1033", "被占用,不能下线"),
MODEL_DELETE_ERROR("1034", "发布状态,不能删除"),
DIMENSION_TABLE_DATABASE_INFO_ERROR("1035", "维度表数据源信息是必须的"),
DIMENSION_TABLE_CREATE_TABLE_ERROR("1036", "维度表创建失败"),
FACT_ATTRIBUTES_CHECK_ERROR("1037", "事实表属性必须包含时间数据类型"),
FACT_TABLES_CREATE_TABLE_ERROR("1038", "事实表创建失败"),
FACT_TABLES_DATABASE_INFO_ERROR("1039", "事实表数据源信息是必须的"),
AGGREGATION_TABLE_DATABASE_INFO_ERROR("1040", "汇总表数据源信息是必须的"),
AGGREGATION_TABLE_CREATE_TABLE_ERROR("1041", "汇总表创建失败"),
AGGREGATION_ATTRIBUTES_CHECK_ERROR("1042", "汇总表必须配置时间周期和指标"),
MODEL_CREATE_ERROR("1043", "创建失败"),
MODEL_OFFLINE_STATUS_ERROR("1044", "当前状态为非发布状态,不允许下线"),
FIELD_NAME_ID_REPEAT_ERROR("1045", "字段名称id不允许重复"),
ASSET_LABEL_DELETE_ERROR("1046", "标签为引用状态,不能删除"),
QUALITY_JOB_NOT_EXIST("1047", "质量作业不存在"),
SYSTEM_TEMPLATE_NOT_OPERATIONAL_ERROR("1048", "系统模板不可操作"),
QUALITY_JOB_RUNNING_NOT_DELETE("1049", "质量作业正在运行,不能删除"),
QUALITY_RULE_SQL_SEMANTIC_VERIFICATION_ERROR("1050", "语义校验失败,请检查。"),
QUALITY_JOB_PERIOD_CRON_NOT_EXIST("1051", "CRON表达式不存在"),
QUALITY_JOB_RUN_TASK_NOT_FIND("1052", "找不到要停止的质量作业任务"),
OUTPUT_SHOW_WITH_SQL_NOT_MATCH_ERROR("1053", "输出结果说明与定义关系不匹配"),
LACK_A_PRIMARY_KEY_ERROR("1054", "至少包含一个主键属性"),
QUALITY_JOB_RUN_ERROR("1055", "启动质量作业失败,请检查质量作业参数..."),
ILLEGAL_OPERATION("1400", "违规操作"),
BUSINESS_OBJECT_NAME_REGEX_CHECK_ERROR("1500", "只允许除右斜杠、<、>、/外的字符"),
/* ******************** 登录权限 **************** */
USER_NAME_REPEAT("1101", "账户已存在"),
LOGIN_INCORRECT("1102", "登录异常"),
LOGIN_NOT_EXISTS("1103", "账户不存在"),
LOGIN_PWD_INCORRECT("1104", "账户或密码不正确"),
NOT_LOGIN_ERROR("1105", "重新登录"),
OLD_PASSWORD_INCORRECT("1106", "旧密码不正确"),
ACCOUNT_HAS_BEEN_DISABLED("1107", "此账号已被禁用"),
ACCOUNT_IS_LOCKED("1108", "此账号已被锁定,请稍后再试"),
ACCOUNT_AUTHENTICATION_FAILED("1109", "账号认证失败"),
UNAUTHORIZED("1110", "权限不足"),
ROLE_CODE_REPEAT("1111", "角色编码已存在"),
SYS_ROLE_DELETE_FAIL("1112", "系统角色不允许删除"),
SYS_MENU_DELETE_FAIL("1113", "还存在子菜单,不能直接删除"),
/* ******************** 操作失败 **************** */
REQUEST_FAIL("1100", "操作失败"),
/* ******************** 操作成功 **************** */
REQUEST_SUCCESS("200", "操作成功");
// 错误编码
private String code;
// 错误信息
private String msg;
// 相应编码有参构造函数
RESPONSE_CODE_ENUM(String code, String msg) {
this.code = code;
this.msg = msg;
}
/**
* 获取编码
*/
public String getCode() {
return code;
}
/**
* 设置编码
*/
public void setCode(String code) {
this.code = code;
}
/**
* 获取编码信息
*/
public String getMsg() {
return msg;
}
/**
* 设置编码信息
*/
public void setMsg(String msg) {
this.msg = msg;
}
}
package cn.wisenergy.chnmuseum.party.common.mvc;
import cn.wisenergy.datastation.common.core.utils.exception.RESPONSE_CODE_ENUM;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.hibernate.validator.internal.engine.path.PathImpl;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.stereotype.Component;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidatorFactory;
import javax.validation.executable.ExecutableValidator;
import java.lang.reflect.Method;
import java.util.Set;
/**
* 参数校验切面
*/
@Slf4j
@Aspect
@Component
public class RequestParamValidAspect {
private final ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
private final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
private final ExecutableValidator validator = factory.getValidator().forExecutables();
private <T> Set<ConstraintViolation<T>> validMethodParams(T obj, Method method, Object[] params) {
return validator.validateParameters(obj, method, params);
}
@Pointcut("execution(* cn.wisenergy.chnmuseum.party.web.*.*.controller.*.*(..))")
public void controllerBefore() {
}
@Before("controllerBefore()")
public void before(JoinPoint point) {
// 获得切入方法参数
Object[] args = point.getArgs();
if (args.length == 0) {
return;
}
/**************************校验封装好的javabean**********************/
//寻找带BindingResult参数的方法,然后判断是否有error,如果有则是校验不通过
// for (Object arg : args) {
// if (arg instanceof BeanPropertyBindingResult) {
// //有校验
// BeanPropertyBindingResult result = (BeanPropertyBindingResult) arg;
// if (result.hasErrors()) {
// List<ObjectError> list = result.getAllErrors();
// for (ObjectError error : list) {
// log.info(error.getCode() + "---" + Arrays.toString(error.getArguments()) + "--" + error.getDefaultMessage());
// //返回第一条校验失败信息。也可以拼接起来返回所有的
// return error.getDefaultMessage();
// }
// }
// }
// }
/**************************校验普通参数*************************/
Object target = point.getThis();
// 获得切入的方法
Method method = ((MethodSignature) point.getSignature()).getMethod();
// 执行校验,获得校验结果
Set<ConstraintViolation<Object>> validResult = validMethodParams(target, method, args);
//如果有校验不通过的
if (!validResult.isEmpty()) {
// 获得方法的参数名称
String[] parameterNames = parameterNameDiscoverer.getParameterNames(method);
for (ConstraintViolation<Object> constraintViolation : validResult) {
// 获得校验的参数路径信息
PathImpl pathImpl = (PathImpl) constraintViolation.getPropertyPath();
// 获得校验的参数位置
int paramIndex = pathImpl.getLeafNode().getParameterIndex();
assert parameterNames != null;
// 获得校验的参数名称
String paramName = parameterNames[paramIndex];
//校验信息
log.info(paramName + ": " + constraintViolation.getMessage());
}
//返回第一条校验失败信息,也可以拼接起来返回所有的
String message = validResult.iterator().next().getMessage();
throw new InterfaceException(RESPONSE_CODE_ENUM.PARAM_NOT_VALID.getCode(), message);
}
}
}
package cn.wisenergy.chnmuseum.party.common.mvc;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.convert.converter.Converter;
import java.text.SimpleDateFormat;
import java.util.Date;
public class StringToDateConverter implements Converter<String, Date> {
private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
private static final String shortDateFormat = "yyyy-MM-dd";
......
package cn.wisenergy.chnmuseum.party.common.mvc;
import cn.wisenergy.chnmuseum.party.common.util.DateUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.convert.converter.Converter;
import java.time.LocalDate;
/**
* @author Danny Lee
* @since 2019-05-31 13:39
*/
public class StringToLocalDateConverter implements Converter<String, LocalDate> {
@Override
public LocalDate convert(String source) {
if (StringUtils.isEmpty(source)) {
return null;
}
return DateUtil.parseStringToDate(source, DateUtil.LONG_DATE_FORMAT);
}
}
package cn.wisenergy.chnmuseum.party.common.mvc;
import cn.wisenergy.chnmuseum.party.common.util.DateUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.convert.converter.Converter;
import java.time.LocalDateTime;
/**
* @author Danny Lee
* @since 2019-05-31 13:39
*/
public class StringToLocalDateTimeConverter implements Converter<String, LocalDateTime> {
@Override
public LocalDateTime convert(String source) {
if (StringUtils.isEmpty(source)) {
return null;
}
return DateUtil.parseStringToDateTime(source, DateUtil.FORMAT_ONE);
}
}
package cn.wisenergy.chnmuseum.party.common.mvc;
import cn.wisenergy.chnmuseum.party.common.util.DateUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.convert.converter.Converter;
import java.time.LocalTime;
/**
* @author Danny Lee
* @since 2019-05-31 13:39
*/
public class StringToLocalTimeConverter implements Converter<String, LocalTime> {
@Override
public LocalTime convert(String source) {
if (StringUtils.isEmpty(source)) {
return null;
}
return DateUtil.parseStringToTime(source, DateUtil.SHORT_TIME_FORMAT);
}
}
package cn.wisenergy.chnmuseum.party.conf;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import cn.wisenergy.chnmuseum.party.common.mvc.StringToDateConverter;
import cn.wisenergy.chnmuseum.party.common.mvc.StringToIntegerConverter;
import cn.wisenergy.chnmuseum.party.common.mvc.*;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.support.GenericConversionService;
import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
@Configuration
public class WebMvcConfig {
......@@ -28,6 +27,10 @@ public class WebMvcConfig {
.getConversionService();
genericConversionService.addConverter(new StringToIntegerConverter());
genericConversionService.addConverter(new StringToDateConverter());
genericConversionService.addConverter(new StringToLocalDateTimeConverter());
genericConversionService.addConverter(new StringToLocalDateConverter());
genericConversionService.addConverter(new StringToLocalTimeConverter());
}
}
......
......@@ -12,7 +12,9 @@ import org.slf4j.LoggerFactory;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* controller 基类控制器
......@@ -45,6 +47,70 @@ public class BaseController implements Serializable {
return new Page<>(_index, _size);
}
/**
* 添加数据到结果对象中
*
* @param obj 封装接口集合参数
* @return map
*/
protected Map<String, Object> getResult(Object obj) {
Map<String, Object> map = new HashMap<>();
map.put(cn.wisenergy.datastation.common.core.enums.RESULT_INFO_ENUM.RESULT_CODE.getKey(), cn.wisenergy.datastation.common.core.utils.exception.RESPONSE_CODE_ENUM.REQUEST_SUCCESS.getCode());
map.put(cn.wisenergy.datastation.common.core.enums.RESULT_INFO_ENUM.RESULT_BODY.getKey(), obj);
return map;
}
/**
* 返回成功
*
* @return map
*/
protected Map<String, Object> getSuccessResult() {
Map<String, Object> map = new HashMap<>();
map.put(cn.wisenergy.datastation.common.core.enums.RESULT_INFO_ENUM.RESULT_CODE.getKey(), cn.wisenergy.datastation.common.core.utils.exception.RESPONSE_CODE_ENUM.REQUEST_SUCCESS.getCode());
map.put(cn.wisenergy.datastation.common.core.enums.RESULT_INFO_ENUM.RESULT_MSG.getKey(), cn.wisenergy.datastation.common.core.utils.exception.RESPONSE_CODE_ENUM.REQUEST_SUCCESS.getMsg());
return map;
}
/**
* 返回失败
*
* @param code 状态码
* @param msg 失败原因
* @return map
*/
protected Map<String, Object> getFailResult(String code, String msg) {
Map<String, Object> map = new HashMap<>();
map.put(cn.wisenergy.datastation.common.core.enums.RESULT_INFO_ENUM.RESULT_CODE.getKey(), code);
map.put(cn.wisenergy.datastation.common.core.enums.RESULT_INFO_ENUM.RESULT_MSG.getKey(), msg);
return map;
}
/**
* 返回失败
*
* @param responseCodeEnum 特定状态码
* @return map
*/
protected Map<String, Object> getFailResult(cn.wisenergy.datastation.common.core.utils.exception.RESPONSE_CODE_ENUM responseCodeEnum) {
Map<String, Object> map = new HashMap<>();
map.put(cn.wisenergy.datastation.common.core.enums.RESULT_INFO_ENUM.RESULT_CODE.getKey(), responseCodeEnum.getCode());
map.put(cn.wisenergy.datastation.common.core.enums.RESULT_INFO_ENUM.RESULT_MSG.getKey(), responseCodeEnum.getMsg());
return map;
}
/**
* 返回失败
*
* @return map
*/
protected Map<String, Object> getFailResult() {
Map<String, Object> map = new HashMap<>();
map.put(cn.wisenergy.datastation.common.core.enums.RESULT_INFO_ENUM.RESULT_CODE.getKey(), cn.wisenergy.datastation.common.core.utils.exception.RESPONSE_CODE_ENUM.SERVER_ERROR.getCode());
map.put(cn.wisenergy.datastation.common.core.enums.RESULT_INFO_ENUM.RESULT_MSG.getKey(), cn.wisenergy.datastation.common.core.utils.exception.RESPONSE_CODE_ENUM.SERVER_ERROR.getMsg());
return map;
}
/**
* JSON 过滤相关字段
*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment