Эх сурвалжийг харах

【亿道外协厂EIS修改接口:增加AOP来记录日志输入输出参数,调整绑定项设置更新物料属性】

xiaost 6 өдөр өмнө
parent
commit
bbef5abb70

+ 10 - 0
src/main/java/com/uas/eis/annotation/ApiLog.java

@@ -0,0 +1,10 @@
+package com.uas.eis.annotation;
+
+import java.lang.annotation.*;
+
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface ApiLog {
+    String actionType() default "";  // 可选操作类型
+}

+ 138 - 0
src/main/java/com/uas/eis/aspect/ApiLogAspect.java

@@ -0,0 +1,138 @@
+package com.uas.eis.aspect;
+
+import com.alibaba.fastjson.JSON;
+import com.uas.eis.annotation.ApiLog;
+import com.uas.eis.core.config.SpObserver;
+import com.uas.eis.dao.BaseDao;
+import com.uas.eis.entity.ErrorMessage;
+import com.uas.eis.exception.ApiSystemException;
+import com.uas.eis.sdk.entity.ApiResult;
+import org.apache.commons.lang.StringUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.lang.reflect.Method;
+
+@Aspect
+@Component
+public class ApiLogAspect {
+
+    @Autowired
+    private BaseDao baseDao;   // 假设您的BaseDao包含执行SQL和保存CLOB的方法
+
+    @Value("${spring.datasource.username}")
+    private String username;
+
+    // 1. 记录请求日志(独立事务)
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    public Long saveRequestLog(String actionType, String requestJson, String accessKey, String requestId) {
+        int id = baseDao.getSeqId("EISAPILOG_SEQ");
+        baseDao.execute("INSERT INTO EISAPILOG(EL_ID, EL_ACTIONTYPE, EL_INDATE, EL_EMCODE) VALUES(?, ?, SYSDATE, ?)",
+                id, actionType, accessKey);
+        baseDao.saveClob("EISAPILOG", "EL_DATA", requestJson, "EL_ID=" + id);
+        return (long) id;
+    }
+
+    // 2. 更新日志结果(独立事务)
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    public void updateLogResult(Long logId, String resultJson,int issuccess) {
+        baseDao.saveClob("EISAPILOG", "EL_RESULT", resultJson, "EL_ID=" + logId);
+        baseDao.execute(
+                "UPDATE EISAPILOG SET EL_ISSUCCESS = ? WHERE EL_ID = ?",
+                issuccess, logId
+        );
+        //issuccess 等于 1 标识成功,0 标识失败
+    }
+
+    // 环绕通知:拦截所有带有 @ApiLog 注解的方法
+    @Around("@annotation(com.uas.eis.annotation.ApiLog)")   // 替换为实际包路径
+    public Object aroundApiLog(ProceedingJoinPoint joinPoint) throws Throwable {
+        // 1. 获取方法参数
+        Object[] args = joinPoint.getArgs();
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        Method method = signature.getMethod();
+        ApiLog apiLog = method.getAnnotation(ApiLog.class);
+        String actionType = apiLog.actionType();
+
+        // 2. 从参数中提取 accessKey, requestId, rawJson(按参数名称或顺序)
+        String accessKey = null;
+        String requestId = null;
+        String rawJson = null;
+        String[] paramNames = signature.getParameterNames();  // 需要编译保留参数名,或使用 Spring 的 LocalVariableTableParameterNameDiscoverer
+        // 这里假设参数顺序固定: (String accessKey, String requestId, SNBindInfoRequest reqData, String rawJson)
+        // 更稳健的方式是根据参数名获取
+        for (int i = 0; i < args.length; i++) {
+            if ("accessKey".equals(paramNames[i])) {
+                accessKey = (String) args[i];
+            } else if ("requestId".equals(paramNames[i])) {
+                requestId = (String) args[i];
+            } else if ("rawJson".equals(paramNames[i])) {
+                rawJson = (String) args[i];
+            }
+        }
+        String AE_MASTER = checkAccessKey(accessKey, requestId);
+        SpObserver.putSp(AE_MASTER);
+
+        // 3. 如果 rawJson 为空,可从 HttpServletRequest 中获取(但需要注意流只能读一次)
+        // 此处暂略,推荐将 rawJson 作为方法参数传递。
+
+        // 4. 记录请求日志,获取日志ID
+        Long logId = saveRequestLog(actionType, rawJson, accessKey, requestId);
+
+        // 5. 执行业务方法(try-catch 确保异常也记录)
+        Object result = null;
+        String resultJson = null;
+        int issuccess = 0;  // 默认失败
+        try {
+            result = joinPoint.proceed();
+            resultJson = JSON.toJSONString(result);
+            // 判断是否为 ApiResult,且 code == "0"
+            if (result instanceof ApiResult) {
+                ApiResult<?> apiResult = (ApiResult<?>) result;
+                if ("0".equals(apiResult.getCode())) {
+                    issuccess = 1;
+                }
+            } else {
+                // 非 ApiResult 类型,可根据业务定义(默认视为成功?此处可自定义)
+                issuccess = 0;  // 或记录为 UNKNOWN,按需处理
+            }
+            return result;
+        } catch (ApiSystemException e) {
+            // 自定义业务异常,包含错误信息
+            ApiResult<?> errorResult = e.getApiResult(); // 假设异常中携带ApiResult
+            resultJson = JSON.toJSONString(errorResult);
+            issuccess = 0;
+            throw e;  // 继续抛出,由全局异常处理器处理
+        } catch (Throwable e) {
+            // 其他异常
+            resultJson = "异常: " + e.getMessage();
+            issuccess = 0;
+            throw e;
+        } finally {
+            // 6. 更新日志(结果和状态)
+            updateLogResult(logId, resultJson, issuccess);
+        }
+    }
+
+    private String checkAccessKey(String accessKey,String requestId){
+        Object accessSecret_O = baseDao.getFieldDataByCondition(username+".APIEMPLOYEE", "AE_SECRET", "AE_KEY='"+accessKey+"'");
+        Object AE_MASTER = baseDao.getFieldDataByCondition(username+".APIEMPLOYEE", "AE_MASTER", "AE_KEY='"+accessKey+"'");
+        String accessSecret = accessSecret_O == null ? "" : accessSecret_O.toString();
+        // 检查KEY是否合理
+        if (StringUtils.isEmpty(accessKey) || StringUtils.isEmpty(accessSecret) || AE_MASTER== null || "".equals(AE_MASTER.toString())) {
+            ApiResult apiResult = new ApiResult();
+            apiResult.setCode(ErrorMessage.ACCESSKEY_ILLEGAL.getCode());
+            apiResult.setMessage(ErrorMessage.ACCESSKEY_ILLEGAL.getMessage());
+            apiResult.setRequestId(requestId);
+            throw new ApiSystemException(apiResult);
+        }
+        return AE_MASTER.toString();
+    }
+}

+ 3 - 52
src/main/java/com/uas/eis/controller/MESDataController.java

@@ -2,7 +2,6 @@ package com.uas.eis.controller;
 
 import com.uas.eis.entity.ErrorMessage;
 import com.uas.eis.entity.ProdBindSetRequest;
-import com.uas.eis.entity.SNBindInfoRequest;
 import com.uas.eis.entity.SNBindMaterialRequest;
 import com.uas.eis.sdk.entity.ApiResult;
 import com.uas.eis.sdk.resp.ApiResponse;
@@ -193,25 +192,7 @@ public class MESDataController {
     public ApiResult<Map<Object,Object>> prodBindSet(HttpServletRequest request,@RequestBody String rawJson){
         String accessKey = request.getHeader("AccessKey");
         String requestId = request.getHeader("RequestId");
-        //@RequestBody ProdBindSetRequest reqData
-        // 获取原始的 JSON 字符串(从 HttpServletRequest 的 body 中读取)
-        // 手动解析 JSON 字符串为 ProdBindSetRequest
-        ProdBindSetRequest reqData;
-        try {
-            reqData = FlexJsonUtil.fromJson(rawJson,ProdBindSetRequest.class);
-        } catch (Exception e) {
-            return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(),requestId,"传参数据格式错误");
-        }
-        // 手动校验
-        Set<ConstraintViolation<ProdBindSetRequest>> violations = validator.validate(reqData);
-        if (!violations.isEmpty()) {
-            String msg = violations.stream()
-                    .map(ConstraintViolation::getMessage)
-                    .distinct()  // 按消息内容去重
-                    .collect(Collectors.joining(";"));
-            return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(), requestId, msg);
-        }
-        return mesDataService.prodBindSet(accessKey,requestId,reqData,rawJson);
+        return mesDataService.prodBindSet(accessKey,requestId,rawJson);
     }
 
 
@@ -225,22 +206,7 @@ public class MESDataController {
     public ApiResult<Map<Object,Object>> SNBindInfo(HttpServletRequest request,@RequestBody String rawJson){
         String accessKey = request.getHeader("AccessKey");
         String requestId = request.getHeader("RequestId");
-        SNBindInfoRequest reqData;
-        try {
-            reqData = FlexJsonUtil.fromJson(rawJson, SNBindInfoRequest.class);
-        } catch (Exception e) {
-            return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(),requestId,"传参数据格式错误");
-        }
-        // 手动校验
-        Set<ConstraintViolation<SNBindInfoRequest>> violations = validator.validate(reqData);
-        if (!violations.isEmpty()) {
-            String msg = violations.stream()
-                    .map(ConstraintViolation::getMessage)
-                    .distinct()  // 按消息内容去重
-                    .collect(Collectors.joining(";"));
-            return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(), requestId, msg);
-        }
-        return mesDataService.SNBindInfo(accessKey,requestId,reqData,rawJson);
+        return mesDataService.SNBindInfo(accessKey,requestId,rawJson);
     }
 
     /**
@@ -253,22 +219,7 @@ public class MESDataController {
     public ApiResult<Map<Object,Object>> SNBindMaterial(HttpServletRequest request,@RequestBody String rawJson){
         String accessKey = request.getHeader("AccessKey");
         String requestId = request.getHeader("RequestId");
-        SNBindMaterialRequest reqData;
-        try {
-            reqData = FlexJsonUtil.fromJson(rawJson, SNBindMaterialRequest.class);
-        } catch (Exception e) {
-            return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(),requestId,"传参数据格式错误");
-        }
-        // 手动校验
-        Set<ConstraintViolation<SNBindMaterialRequest>> violations = validator.validate(reqData);
-        if (!violations.isEmpty()) {
-            String msg = violations.stream()
-                    .map(ConstraintViolation::getMessage)
-                    .distinct()  // 按消息内容去重
-                    .collect(Collectors.joining(";"));
-            return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(), requestId, msg);
-        }
-        return mesDataService.SNBindMaterial(accessKey,requestId,reqData,rawJson);
+        return mesDataService.SNBindMaterial(accessKey,requestId,rawJson);
     }
 
 

+ 3 - 3
src/main/java/com/uas/eis/service/MESDataService.java

@@ -38,11 +38,11 @@ public interface MESDataService {
 
 	ApiResult<Map<Object,Object>> barcode(String accessKey, String requestId, String data);
 
-	ApiResult<Map<Object, Object>> prodBindSet(String accessKey, String requestId, ProdBindSetRequest reqData,String jsonData);
+	ApiResult<Map<Object, Object>> prodBindSet(String accessKey, String requestId,String rawJson);
 
-	ApiResult<Map<Object, Object>> SNBindInfo(String accessKey, String requestId, SNBindInfoRequest reqData, String rawJson);
+	ApiResult<Map<Object, Object>> SNBindInfo(String accessKey, String requestId,String rawJson);
 
-	ApiResult<Map<Object, Object>> SNBindMaterial(String accessKey, String requestId, SNBindMaterialRequest reqData, String rawJson);
+	ApiResult<Map<Object, Object>> SNBindMaterial(String accessKey, String requestId, String rawJson);
 
 	ApiResult<Map<Object, Object>> checkSNBind(String accessKey, String requestId, String rawJson);
 }

+ 87 - 15
src/main/java/com/uas/eis/serviceImpl/MESDataServiceImpl.java

@@ -1,5 +1,6 @@
 package com.uas.eis.serviceImpl;
 
+import com.uas.eis.annotation.ApiLog;
 import com.uas.eis.core.config.SpObserver;
 import com.uas.eis.dao.BaseDao;
 import com.uas.eis.dao.SqlRowList;
@@ -19,6 +20,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.validation.ConstraintViolation;
+import javax.validation.Validator;
 import java.sql.Timestamp;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -34,6 +37,9 @@ public class MESDataServiceImpl implements MESDataService {
 
 	String Master;
 
+	@Autowired
+	private Validator validator;
+
 	@Override
 	public List<Map<Object,Object>> snStepPass(String accessKey, String requestId, String data) {
 		String AE_MASTER = checkAccessKey(accessKey, requestId);
@@ -547,7 +553,7 @@ public class MESDataServiceImpl implements MESDataService {
 	/**
 	 * @add xiaost 2026-06-01
 	 * 设置产品SN强制绑定项
-	 * @param jsonData
+	 * @param rawJson
 	 * * .{
 	 *      * ."code": "PRODBINDSET",
 	 *      * ."data":{
@@ -566,15 +572,18 @@ public class MESDataServiceImpl implements MESDataService {
 	 * @return
 	 */
 	@Override
-	public ApiResult<Map<Object, Object>> prodBindSet(String accessKey, String requestId, ProdBindSetRequest reqData,String jsonData) {
+	@ApiLog(actionType = "设置产品SN强制绑定项")
+	public ApiResult<Map<Object, Object>> prodBindSet(String accessKey, String requestId, String rawJson) {
 		String AE_MASTER = checkAccessKey(accessKey, requestId);
 		SpObserver.putSp(AE_MASTER);  //切换数据源
 		//保存传参数据原始JSON串,记录日志
-		savelog("设置产品SN强制绑定项",jsonData,accessKey,requestId);
+		//savelog("设置产品SN强制绑定项",rawJson,accessKey,requestId);
+		ProdBindSetRequest reqData = prodBindSetCheck(requestId,rawJson);
 		//执行业务操作
 		return executeSNBindSet(accessKey,requestId,reqData);
 	}
 
+
 	/**
 	 * @add xiaost 2026-06-03
 	 * SN序列号测试LOG采集信息
@@ -600,16 +609,15 @@ public class MESDataServiceImpl implements MESDataService {
 	 * @return
 	 */
 	@Override
-	public ApiResult<Map<Object, Object>> SNBindInfo(String accessKey, String requestId, SNBindInfoRequest reqData, String rawJson) {
+	@ApiLog(actionType = "SN序列号测试LOG采集信息")
+	public ApiResult<Map<Object, Object>> SNBindInfo(String accessKey, String requestId,String rawJson) {
 		String AE_MASTER = checkAccessKey(accessKey, requestId);
 		SpObserver.putSp(AE_MASTER);  //切换数据源
-		//保存传参数据原始JSON串,记录日志
-		savelog("SN序列号测试LOG采集信息",rawJson,accessKey,requestId);
+		SNBindInfoRequest reqData = SNBindInfoCheck(requestId,rawJson);
 		//执行业务操作
 		return executeSNBindInfo(accessKey,requestId,reqData);
 	}
 
-
 	/**
 	 * @add xiaost 2026-06-03
 	 * 接收SN序列号扫码绑定物料结果
@@ -635,11 +643,13 @@ public class MESDataServiceImpl implements MESDataService {
 	 * @return
 	 */
 	@Override
-	public ApiResult<Map<Object, Object>> SNBindMaterial(String accessKey, String requestId, SNBindMaterialRequest reqData, String rawJson) {
+	@ApiLog(actionType = "接收SN序列号扫码绑定物料结果")
+	public ApiResult<Map<Object, Object>> SNBindMaterial(String accessKey, String requestId, String rawJson) {
 		String AE_MASTER = checkAccessKey(accessKey, requestId);
 		SpObserver.putSp(AE_MASTER);  //切换数据源
 		//保存传参数据原始JSON串,记录日志
-		savelog("接收SN序列号扫码绑定物料结果",rawJson,accessKey,requestId);
+		//savelog("接收SN序列号扫码绑定物料结果",rawJson,accessKey,requestId);
+		SNBindMaterialRequest reqData = SNBindMaterialCheck(requestId,rawJson);
 		//执行业务操作
 		return executeSNBindMaterial(accessKey,requestId,reqData);
 	}
@@ -660,11 +670,12 @@ public class MESDataServiceImpl implements MESDataService {
 	 * @return
 	 */
 	@Override
+	@ApiLog(actionType = "校验SN序列号绑定数据")
 	public ApiResult<Map<Object, Object>> checkSNBind(String accessKey, String requestId, String rawJson) {
 		String AE_MASTER = checkAccessKey(accessKey, requestId);
 		SpObserver.putSp(AE_MASTER);  //切换数据源
 		//保存传参数据原始JSON串,记录日志
-		savelog("校验SN序列号绑定数据",rawJson,accessKey,requestId);
+		//savelog("校验SN序列号绑定数据",rawJson,accessKey,requestId);
 		Map<Object, Object> map = BaseUtil.parseFormStoreToMap(rawJson);
 		if(!map.containsKey("data") || !StringUtil.hasText(map.get("data"))){
 			return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(), requestId, "参数错误sncode不能为空");
@@ -707,7 +718,6 @@ public class MESDataServiceImpl implements MESDataService {
 		String macode = dataDTO.getSm_macode();
 		String type = dataDTO.getType();
 		List<SNBindMaterialRequest.DetailDTO> detailList = dataDTO.getDetail();
-
 		//绑定项编号不能重复
 		Set<String> set = new HashSet<>();
 		List<String> duplicates = detailList.stream()
@@ -806,7 +816,6 @@ public class MESDataServiceImpl implements MESDataService {
 	@Transactional
 	public ApiResult<Map<Object, Object>> executeSNBindInfo(String accessKey, String requestId, SNBindInfoRequest reqData) {
 		List<SNBindInfoRequest.DetailDTO> detailList =  reqData.getData().getDetail();
-
 		Set<String> set = new HashSet<>();
 		List<String> duplicates = detailList.stream()
 				.map(SNBindInfoRequest.DetailDTO::getSi_sncode)
@@ -961,9 +970,11 @@ public class MESDataServiceImpl implements MESDataService {
 				i++;
 			}
 			baseDao.getJdbcTemplate().batchUpdate(insertSql, batchArgs);
+			baseDao.execute("update product set pr_nocheckm=0 where pr_code=? and nvl(pr_nocheckm,0) != 0 ",ss_mothercode);
 		} else if ("DEL".equals(type)) {
+			baseDao.execute("update product set pr_nocheckm=-1 where pr_code=? and nvl(pr_nocheckm,0) != -1",ss_mothercode);
 			if(ss_id == 0){
-				return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(), requestId, "错误,当前产品编号:"+ss_mothercode+",未设置绑定项,不需要删除");
+				return ApiResponse.successRsp("0", requestId, "错误,当前产品编号:"+ss_mothercode+",未设置绑定项,不需要删除");
 			}else {  //不存在
 				baseDao.execute("delete from SNBINDSET where ss_mothercode=?",ss_mothercode);
 			}
@@ -979,8 +990,8 @@ public class MESDataServiceImpl implements MESDataService {
 	}
 
 	private String checkAccessKey(String accessKey,String requestId){
-		Object accessSecret_O = baseDao.getFieldDataByCondition("APIEMPLOYEE", "AE_SECRET", "AE_KEY='"+accessKey+"'");
-		Object AE_MASTER = baseDao.getFieldDataByCondition("APIEMPLOYEE", "AE_MASTER", "AE_KEY='"+accessKey+"'");
+		Object accessSecret_O = baseDao.getFieldDataByCondition(username+".APIEMPLOYEE", "AE_SECRET", "AE_KEY='"+accessKey+"'");
+		Object AE_MASTER = baseDao.getFieldDataByCondition(username+".APIEMPLOYEE", "AE_MASTER", "AE_KEY='"+accessKey+"'");
 		String accessSecret = accessSecret_O == null ? "" : accessSecret_O.toString();
 		// 检查KEY是否合理
 		if (StringUtils.isEmpty(accessKey) || StringUtils.isEmpty(accessSecret) || AE_MASTER== null || "".equals(AE_MASTER.toString())) {
@@ -993,5 +1004,66 @@ public class MESDataServiceImpl implements MESDataService {
 		return AE_MASTER.toString();
 	}
 
+	private ProdBindSetRequest prodBindSetCheck(String requestId, String rawJson) {
+		//@RequestBody ProdBindSetRequest reqData
+		// 获取原始的 JSON 字符串(从 HttpServletRequest 的 body 中读取)
+		// 手动解析 JSON 字符串为 ProdBindSetRequest
+		ProdBindSetRequest reqData;
+		try {
+			reqData = FlexJsonUtil.fromJson(rawJson, ProdBindSetRequest.class);
+		} catch (Exception e) {
+			throw new ApiSystemException(new ApiResult(ErrorMessage.ACCESSKEY_ILLEGAL.getCode(),requestId,"传参数据格式错误"));
+			//return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(), requestId, "传参数据格式错误");
+		}
+		// 手动校验
+		Set<ConstraintViolation<ProdBindSetRequest>> violations = validator.validate(reqData);
+		if (!violations.isEmpty()) {
+			String msg = violations.stream()
+					.map(ConstraintViolation::getMessage)
+					.distinct()  // 按消息内容去重
+					.collect(Collectors.joining(";"));
+			throw new ApiSystemException(new ApiResult(ErrorMessage.ACCESSKEY_ILLEGAL.getCode(),requestId,"传参数据格式错误"));
+		}
+		return reqData;
+	}
+
+	private SNBindInfoRequest SNBindInfoCheck(String requestId,String rawJson){
+		SNBindInfoRequest reqData;
+		try {
+			reqData = FlexJsonUtil.fromJson(rawJson, SNBindInfoRequest.class);
+		} catch (Exception e) {
+			throw new ApiSystemException(new ApiResult(ErrorMessage.ACCESSKEY_ILLEGAL.getCode(),requestId,"传参数据格式错误"));
+		}
+		// 手动校验
+		Set<ConstraintViolation<SNBindInfoRequest>> violations = validator.validate(reqData);
+		if (!violations.isEmpty()) {
+			String msg = violations.stream()
+					.map(ConstraintViolation::getMessage)
+					.distinct()  // 按消息内容去重
+					.collect(Collectors.joining(";"));
+			throw new ApiSystemException(new ApiResult(ErrorMessage.ACCESSKEY_ILLEGAL.getCode(),requestId,msg));
+		}
+		return reqData;
+	}
+
+
+	private SNBindMaterialRequest SNBindMaterialCheck(String requestId, String rawJson){
+		SNBindMaterialRequest reqData;
+		try {
+			reqData = FlexJsonUtil.fromJson(rawJson, SNBindMaterialRequest.class);
+		} catch (Exception e) {
+			throw new ApiSystemException(new ApiResult(ErrorMessage.ACCESSKEY_ILLEGAL.getCode(),requestId,"传参数据格式错误"));
+		}
+		// 手动校验
+		Set<ConstraintViolation<SNBindMaterialRequest>> violations = validator.validate(reqData);
+		if (!violations.isEmpty()) {
+			String msg = violations.stream()
+					.map(ConstraintViolation::getMessage)
+					.distinct()  // 按消息内容去重
+					.collect(Collectors.joining(";"));
+			throw new ApiSystemException(new ApiResult(ErrorMessage.ACCESSKEY_ILLEGAL.getCode(),requestId,msg));
+		}
+		return reqData;
+	}
 
 }