package com.vci.web.other; import com.vci.web.annotation.BdSelectInput; import com.vci.web.dao.BdSelectInputCharDaoI; import com.vci.model.BdSelectInputCharDO; import com.vci.web.util.WebUtil; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 可以输入也可以选择的切面程序 * @author weidy * @date 2022-3-16 */ @Aspect @Component public class BdSelectInputCharAspect { /** * 当前类的日志输出 */ private Logger logger = LoggerFactory.getLogger(getClass()); /** * 数据操作类 */ @Resource private BdSelectInputCharDaoI selectInputCharDao; /** * 所有的BdSelectInput注解的 */ @Pointcut("execution(public * com.vci..*.*(..)) && @target(com.vci.web.annotation.BdSelectInput) ") public void selectInputChar(){ } /** * 执行完成后记录 * @param joinPoint 切入点 */ @AfterReturning(pointcut = "selectInputChar()",returning = "returnVal") public void saveChar(JoinPoint joinPoint,Object returnVal){ try { Method method = getMethod(joinPoint); //获取方法上的参数 BdSelectInput selectInput = method.getAnnotation(BdSelectInput.class); if (selectInput == null) { method.getDeclaredAnnotation(BdSelectInput.class); } if (selectInput != null) { String fieldString = selectInput.value(); ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer(); String[] parameterNames = pnd.getParameterNames(method); Object[] args = joinPoint.getArgs(); //从参数里面找到对应的值 String value = getValueFromParam(fieldString, parameterNames, args); String flag = selectInput.flag(); String namespace = selectInput.namespace(); if (flag == null) { flag = "default"; } if (namespace == null) { namespace = "default"; } if (StringUtils.isNotBlank(value)) { BdSelectInputCharDO sic = new BdSelectInputCharDO(); sic.setSourceNameSpace(namespace); sic.setSourceInputFlag(flag); sic.setId(value); if (logger.isInfoEnabled()) { logger.info("本次保存的字符内容,{0}", sic.toString()); } selectInputCharDao.insert(sic); } } }catch (Throwable e){ logger.error("切面记录可选字符的时候出错",e); } } /** * 多个分隔符 */ public static final String SEP = "${SEP}"; /** * 从参数里获取值 * @param fieldString 字段的表达式 * @param parameterNames 参数的名字 * @param args 参数的对象 * @return 记录的值 */ private String getValueFromParam(String fieldString, String[] parameterNames, Object[] args) { String value = ""; String[] split = fieldString.split("."); if(split.length>0) { String paramName = split[0]; for (int i = 0; i < parameterNames.length; i++) { if (paramName.equalsIgnoreCase(parameterNames[i])) { Object param = args[i]; //在看看里面的内容 if (split.length == 1) { //只有一个,那就是这个参数了 if(param!=null){ value = param.toString(); } }else{ //第二层 Object fieldValue = WebUtil.getValueFromField(split[1],param); if(fieldValue instanceof Collection){ List values = new ArrayList<>(); ((Collection)fieldValue).stream().forEach(fv ->{ if (split.length > 2) { //说明还要往下找 Object fromField = WebUtil.getValueFromField(split[2], fv); values.add(WebUtil.getStringValueFromObject(fromField)); } else { values.add(WebUtil.getStringValueFromObject(fv)); } }); value = values.stream().collect(Collectors.joining(SEP)); }else if(fieldValue instanceof Map){ List values = new ArrayList<>(); ((Map)fieldValue).values().stream().forEach(fv ->{ if (split.length > 2) { //说明还要往下找 Object fromField = WebUtil.getValueFromField(split[2], fv); values.add(WebUtil.getStringValueFromObject(fromField)); } else { values.add(WebUtil.getStringValueFromObject(fv)); } }); value = values.stream().collect(Collectors.joining(SEP)); }else { if (split.length > 2) { //说明还要往下找 fieldValue = WebUtil.getValueFromField(split[2], fieldValue); value = WebUtil.getStringValueFromObject(fieldValue); } else { value = WebUtil.getStringValueFromObject(fieldValue); } } } break; } } } return value; } /** * 获取被调用的方法 * @param joinPoint 切入点 * @return 调用的方法 */ public Method getMethod(JoinPoint joinPoint){ MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); return method; } }