工作需求:在已有的项目中 增加操作日志功能,  要求  操作记录详细到 具体字段的修改,可指定具体需要记录的字段。

工作分三步走:

第一,增加自定义注解,确定拦截数据的格式。

第二:增加aop拦截器。

第三:业务代码。

 

第一,增加自定义注解,确定拦截数据的格式。

1.声明 @interface 类 。 

2.:声明 注解应用于方法级别   @Target({ElementType.METHOD,ElementType.PARAMETER})

3.声明 注解 运行时可用   @Retention(RetentionPolicy.RUNTIME)

4.声明 业务需要的 三个参数,optionType 操作类型   optionModel  操作模块   optionContent 操作内容

示例注解格式:

@OptionLog(optionType = "update",optionModel = "feedBack",optionContent = "将[{contact}]的反馈状态修改为[{ctrlFlagName}],添加备注[{remarks}]")
/**
 * todo:
 * 类SysLog的功能描述:
 * 系统日志注解
 */
@Target({ElementType.METHOD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
//@Documented
public @interface OptionLog {
    String optionType() default "select";
    String optionModel() default "";
    String optionContent() default "";
}

 

第二:增加aop拦截器。

1.使用@Aspect 新建切面类。

@Component
@Aspect
public class OptionInterceptor

2.定义切点方法。@Pointcut

@Pointcut("execution (* com.jjjjj.hangzhou.pillow.dao..*.*(..))")
public void daoAspect(){

}

3.使用后置返回通知 @AfterReturning 确保本次操作完成后 ,记录日志操作。

@AfterReturning(value = "daoAspect()",returning = "returnValue")
public void doAfterReturn(JoinPoint joinPoint,Object returnValue)

第三:在aop通知中增加业务处理工作。

1.获取方法名,并通过spring获取注解,判断当前方法是否被注解。

Signature signature = joinPoint.getSignature(); //方法签名
Method method = ((MethodSignature)signature).getMethod();
//获取真正的带注解的方法
OptionLog optionLog = AnnotationUtils.findAnnotation(method,OptionLog.class);
if(!ObjectUtils.isEmpty(optionLog))

2.获取注解中的参数和方法中的参数,匹配修改自定义的日志格式。

//操作记录原始记录
StringBuffer optionDetails = new StringBuffer();
//返回参数
Object[] args = joinPoint.getArgs();
String[] argNames = ((MethodSignature)joinPoint.getSignature()).getParameterNames();

//logger.info("args:"+args[0]);
//logger.info("argName:"+argNames[0]);
//logger.info("returnValue"+returnValue);
Class c3 = args[0].getClass();
Field[] fields = c3.getDeclaredFields();
if(optionLog.optionType().equals("update")) {
    optionDetails.append("发生修改操作:[");
    for(int x=0;x<fields.length;x++){
        Field field = fields[x];
        field.setAccessible(true);
        String fieldName = field.getName();
        String fieldValue = getFieldValue(field,args[0]);  //获取参数值
        if(!fieldName.equals("serialVersionUID") && !ObjectUtils.isEmpty(fieldValue)) {
            System.out.println();
            //System.out.println("属性名:" + fieldName + ",属性值:" + fieldValue);
            optionDetails.append("{colume:"+fieldName+",newValue:"+fieldValue+"},");
        }
    }
    optionDetails.append("]");
/**
     * 后置返回通知
     */
    @AfterReturning(value = "daoAspect()",returning = "returnValue")
    public void doAfterReturn(JoinPoint joinPoint,Object returnValue){
        try {
            Signature signature = joinPoint.getSignature(); //方法签名
            Method method = ((MethodSignature)signature).getMethod();
            //获取真正的带注解的方法
            OptionLog optionLog = AnnotationUtils.findAnnotation(method,OptionLog.class);
            if(!ObjectUtils.isEmpty(optionLog)){
                logger.info("后置返回通知,操作类型:" + optionLog.optionType() +",操作模块:"+ optionLog.optionModel());

                //操作记录原始记录
                StringBuffer optionDetails = new StringBuffer();
                //返回参数
                Object[] args = joinPoint.getArgs();
                String[] argNames = ((MethodSignature)joinPoint.getSignature()).getParameterNames();

                //logger.info("args:"+args[0]);
                //logger.info("argName:"+argNames[0]);
                //logger.info("returnValue"+returnValue);
                Class c3 = args[0].getClass();
                Field[] fields = c3.getDeclaredFields();
                if(optionLog.optionType().equals("update")) {
                    optionDetails.append("发生修改操作:[");
                    for(int x=0;x<fields.length;x++){
                        Field field = fields[x];
                        field.setAccessible(true);
                        String fieldName = field.getName();
                        String fieldValue = getFieldValue(field,args[0]);
                        if(!fieldName.equals("serialVersionUID") && !ObjectUtils.isEmpty(fieldValue)) {
                            System.out.println();
                            //System.out.println("属性名:" + fieldName + ",属性值:" + fieldValue);
                            optionDetails.append("{colume:"+fieldName+",newValue:"+fieldValue+"},");
                        }
                    }
                    optionDetails.append("]");
                }else if(optionLog.optionType().equals("insert")) {
                    optionDetails.append("发生插入操作:[");
                    for(int x=0;x<fields.length;x++){
                        Field field = fields[x];
                        field.setAccessible(true);
                        String fieldName = field.getName();
                        String fieldValue = getFieldValue(field,args[0]);
                        if(!fieldName.equals("serialVersionUID") && !ObjectUtils.isEmpty(fieldValue)) {
                            optionDetails.append("{colume:"+fieldName+",newValue:"+fieldValue+"},");
                        }
                    }
                    optionDetails.append("]");
                }else if(optionLog.optionType().equals("delete")) {
                    optionDetails.append("发生删除操作:[");
                    for(int x=0;x<args.length;x++){
                        if(ObjectUtils.isEmpty(argNames)){
                            optionDetails.append("{colume:id,value:"+args[x]+"},");
                        }else{
                            optionDetails.append("{colume:"+argNames[x]+",value:"+args[x]+"},");
                        }
                    }
                    optionDetails.append("]");
                }
                logger.info("数据日志:"+optionDetails.toString());

                //操作记录 客户要求记录
                String optionContent = optionLog.optionContent();
                if(!ObjectUtils.isEmpty(optionContent)){
                    if(optionLog.optionType().equals("update")||optionLog.optionType().equals("insert")) {
                        List<String> keys = getBraces(optionContent);
                        if (!ObjectUtils.isEmpty(keys)) {
                            for (int t = 0; t < keys.size(); t++) {
                                for (int x = 0; x < fields.length; x++) {
                                    Field field = fields[x];
                                    field.setAccessible(true);
                                    String fieldName = field.getName();
                                    if (fieldName.equals(keys.get(t))) {
                                        String fieldValue = getFieldValue(field, args[0]);
                                        optionContent = optionContent.replace("{" + keys.get(t) + "}", fieldValue);
                                        break;
                                    }
                                }
                            }
                        }
                    }else if(optionLog.optionType().equals("delete")){
                        if(optionLog.optionModel().equals("businessManagement")){
                            SysTenant s = sysTenantDao.queryById(Long.valueOf(args[0]+""));
                            optionContent = optionContent.replace("{id}", s.getName()+"");
                        }else if(optionLog.optionModel().equals("adminManagement")){
                            SysUser s = sysUserDao.queryById(Long.valueOf(args[0]+""));
                            optionContent = optionContent.replace("{id}", s.getNickName()+"");
                        }else if(optionLog.optionModel().equals("menuManagement")){
                            SysMenu s = sysMenuDao.queryById(Long.valueOf(args[0]+""));
                            optionContent = optionContent.replace("{id}", s.getTitle()+"");
                        }else if(optionLog.optionModel().equals("roleManagement")){
                            SysRole s = sysRoleDao.queryById(Long.valueOf(args[0]+""));
                            optionContent = optionContent.replace("{id}", s.getName()+"");
                        }else{
                            optionContent = optionContent.replace("{id}", args[0]+"");
                        }
                    }
                }
                //插入数据
                sysOptionLogDao.insert(SysOptionLog.builder().createBy(Long.valueOf(1)).modelId(1l)
                        .optionType(optionLog.optionType()).optionContent(optionContent)
                        .optionModel(optionLog.optionModel()).optionDetails(optionDetails.toString()).build());
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

注意:通过反射获取参数值,需要首先匹配参数类型

private String getFieldValue(Field field,Object object){
        String val = "";
        try {
            //判断反射域的类型
            //1.String类型
            if (field.getType().getName().equals("java.lang.String")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                String value = (String)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value;
            }
            //2. Integer 类型
            if (field.getType().getName().equals("java.lang.Integer")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Integer value = (Integer)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //3. Long 类型
            if (field.getType().getName().equals("java.lang.Long")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Long value = (Long)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //4. Double 类型
            if (field.getType().getName().equals("java.lang.Double")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Double value = (Double)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //5. Float 类型
            if (field.getType().getName().equals("java.lang.Float")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Float value = (Float)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //6. Boolean 类型
            if (field.getType().getName().equals("java.lang.Boolean")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Boolean value = (Boolean)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //7. Short 类型
            if (field.getType().getName().equals("java.lang.Short")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Short value = (Short)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //8. Byte 类型
            if (field.getType().getName().equals("java.lang.Byte")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Byte value = (Byte)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //9. Character 类型
            if (field.getType().getName().equals("java.lang.Character")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Character value = (Character)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //10. Date 类型
            if (field.getType().getName().equals("java.util.Date")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Date value = (Date)m.invoke(object);
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                if(!ObjectUtils.isEmpty(value))val = sdf.format(value);
            }
            //11. BigDecimal 类型
            if (field.getType().getName().equals("java.math.BigDecimal")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                BigDecimal value = (BigDecimal)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //12. List 类型
            if (field.getType().getName().equals("java.util.List")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                List value = (List)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //13. LocalDate 类型
            if (field.getType().getName().equals("java.time.LocalDate")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                LocalDate value = (LocalDate)m.invoke(object);
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                if(!ObjectUtils.isEmpty(value))val = formatter.format(value);
            }
            //14. LocalTime 类型
            if (field.getType().getName().equals("java.time.LocalTime")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                LocalTime value = (LocalTime)m.invoke(object);
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
                if(!ObjectUtils.isEmpty(value))val = formatter.format(value);
            }
            //15. LocalDateTime 类型
            if (field.getType().getName().equals("java.time.LocalDateTime")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                LocalDateTime value = (LocalDateTime)m.invoke(object);
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                if(!ObjectUtils.isEmpty(value))val = formatter.format(value);
            }
        }catch (Exception e){}
        return val;
    }

 

四:使用注解。

@SqlInterceptorAnnotation
    List<FeedBack> queryAllByLimit(@Param("offset") int offset, @Param("limit") int limit,@Param("feedBack") FeedBack feedBack);

/**
     * 新增数据
     *
     * @param sysUser 实例对象
     * @return 影响行数
     */
    @OptionLog(optionType = "insert",optionModel = "adminManagement",optionContent = "新增管理员[{nickName}]")
    int insert(SysUser sysUser);

    /**
     * 修改数据
     *
     * @param sysUser 实例对象
     * @return 影响行数
     */
    @OptionLog(optionType = "update",optionModel = "adminManagement",optionContent = "修改管理员[{nickName}]")
    int update(SysUser sysUser);

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 影响行数
     */
    @OptionLog(optionType = "delete",optionModel = "adminManagement",optionContent = "删除管理员[{id}]")
    int deleteById(Long id);

五:完整代码(涉及其它业务类的代码,大家自己替换或删除)。

注解类:OptionLog

import java.lang.annotation.*;

/**
 * Created by csc
 * todo:
 * 类SysLog的功能描述:
 * 系统日志注解
 */
@Target({ElementType.METHOD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
//@Documented
public @interface OptionLog {
    String optionType() default "select";
    String optionModel() default "";
    String optionContent() default "";
}

切面类:OptionInterceptor

 

import com.fffff.hangzhou.pillow.common.annotation.OptionLog;
import com.fffff.hangzhou.pillow.dao.*;
import com.fffff.hangzhou.pillow.entity.*;
import com.fffff.hangzhou.pillow.util.APIUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;

import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * cscssg
 */
@Component
@Aspect
public class OptionInterceptor {

    private static Logger logger = LoggerFactory.getLogger(OptionInterceptor.class);

    @Resource
    private SysOptionLogDao sysOptionLogDao;
    @Resource
    private SysTenantDao sysTenantDao;
    @Resource
    private SysUserDao sysUserDao;
    @Resource
    private SysMenuDao sysMenuDao;
    @Resource
    private SysRoleDao sysRoleDao;

    /**
     * 定义切点
     */
    @Pointcut("execution (* com.fffff.hangzhou.pillow.dao..*.*(..))")
    public void daoAspect(){

    }

    /**
     * 后置返回通知
     */
    @AfterReturning(value = "daoAspect()",returning = "returnValue")
    public void doAfterReturn(JoinPoint joinPoint,Object returnValue){
        try {
            Signature signature = joinPoint.getSignature(); //方法签名
            Method method = ((MethodSignature)signature).getMethod();
            //获取真正的带注解的方法
            OptionLog optionLog = AnnotationUtils.findAnnotation(method,OptionLog.class);
            if(!ObjectUtils.isEmpty(optionLog)){
                logger.info("后置返回通知,操作类型:" + optionLog.optionType() +",操作模块:"+ optionLog.optionModel());

                //操作记录原始记录
                StringBuffer optionDetails = new StringBuffer();
                //返回参数
                Object[] args = joinPoint.getArgs();
                String[] argNames = ((MethodSignature)joinPoint.getSignature()).getParameterNames();

                //logger.info("args:"+args[0]);
                //logger.info("argName:"+argNames[0]);
                //logger.info("returnValue"+returnValue);
                Class c3 = args[0].getClass();
                Field[] fields = c3.getDeclaredFields();
                if(optionLog.optionType().equals("update")) {
                    optionDetails.append("发生修改操作:[");
                    for(int x=0;x<fields.length;x++){
                        Field field = fields[x];
                        field.setAccessible(true);
                        String fieldName = field.getName();
                        String fieldValue = getFieldValue(field,args[0]);
                        if(!fieldName.equals("serialVersionUID") && !ObjectUtils.isEmpty(fieldValue)) {
                            System.out.println();
                            //System.out.println("属性名:" + fieldName + ",属性值:" + fieldValue);
                            optionDetails.append("{colume:"+fieldName+",newValue:"+fieldValue+"},");
                        }
                    }
                    optionDetails.append("]");
                }else if(optionLog.optionType().equals("insert")) {
                    optionDetails.append("发生插入操作:[");
                    for(int x=0;x<fields.length;x++){
                        Field field = fields[x];
                        field.setAccessible(true);
                        String fieldName = field.getName();
                        String fieldValue = getFieldValue(field,args[0]);
                        if(!fieldName.equals("serialVersionUID") && !ObjectUtils.isEmpty(fieldValue)) {
                            optionDetails.append("{colume:"+fieldName+",newValue:"+fieldValue+"},");
                        }
                    }
                    optionDetails.append("]");
                }else if(optionLog.optionType().equals("delete")) {
                    optionDetails.append("发生删除操作:[");
                    for(int x=0;x<args.length;x++){
                        if(ObjectUtils.isEmpty(argNames)){
                            optionDetails.append("{colume:id,value:"+args[x]+"},");
                        }else{
                            optionDetails.append("{colume:"+argNames[x]+",value:"+args[x]+"},");
                        }
                    }
                    optionDetails.append("]");
                }
                logger.info("数据日志:"+optionDetails.toString());

                //操作记录 客户要求记录
                String optionContent = optionLog.optionContent();
                if(!ObjectUtils.isEmpty(optionContent)){
                    if(optionLog.optionType().equals("update")||optionLog.optionType().equals("insert")) {
                        List<String> keys = getBraces(optionContent);
                        if (!ObjectUtils.isEmpty(keys)) {
                            for (int t = 0; t < keys.size(); t++) {
                                for (int x = 0; x < fields.length; x++) {
                                    Field field = fields[x];
                                    field.setAccessible(true);
                                    String fieldName = field.getName();
                                    if (fieldName.equals(keys.get(t))) {
                                        String fieldValue = getFieldValue(field, args[0]);
                                        optionContent = optionContent.replace("{" + keys.get(t) + "}", fieldValue);
                                        break;
                                    }
                                }
                            }
                        }
                    }else if(optionLog.optionType().equals("delete")){
                        if(optionLog.optionModel().equals("businessManagement")){
                            SysTenant s = sysTenantDao.queryById(Long.valueOf(args[0]+""));
                            optionContent = optionContent.replace("{id}", s.getName()+"");
                        }else if(optionLog.optionModel().equals("adminManagement")){
                            SysUser s = sysUserDao.queryById(Long.valueOf(args[0]+""));
                            optionContent = optionContent.replace("{id}", s.getNickName()+"");
                        }else if(optionLog.optionModel().equals("menuManagement")){
                            SysMenu s = sysMenuDao.queryById(Long.valueOf(args[0]+""));
                            optionContent = optionContent.replace("{id}", s.getTitle()+"");
                        }else if(optionLog.optionModel().equals("roleManagement")){
                            SysRole s = sysRoleDao.queryById(Long.valueOf(args[0]+""));
                            optionContent = optionContent.replace("{id}", s.getName()+"");
                        }else{
                            optionContent = optionContent.replace("{id}", args[0]+"");
                        }
                    }
                }
                //插入数据
                sysOptionLogDao.insert(SysOptionLog.builder().createBy(Long.valueOf(1)).modelId(1l)
                        .optionType(optionLog.optionType()).optionContent(optionContent)
                        .optionModel(optionLog.optionModel()).optionDetails(optionDetails.toString()).build());
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 获取类对象的参数值
     * @param field  参数值域
     * @param object  类对象
     * @return
     */
    private String getFieldValue(Field field,Object object){
        String val = "";
        try {
            //判断反射域的类型
            //1.String类型
            if (field.getType().getName().equals("java.lang.String")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                String value = (String)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value;
            }
            //2. Integer 类型
            if (field.getType().getName().equals("java.lang.Integer")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Integer value = (Integer)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //3. Long 类型
            if (field.getType().getName().equals("java.lang.Long")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Long value = (Long)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //4. Double 类型
            if (field.getType().getName().equals("java.lang.Double")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Double value = (Double)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //5. Float 类型
            if (field.getType().getName().equals("java.lang.Float")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Float value = (Float)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //6. Boolean 类型
            if (field.getType().getName().equals("java.lang.Boolean")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Boolean value = (Boolean)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //7. Short 类型
            if (field.getType().getName().equals("java.lang.Short")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Short value = (Short)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //8. Byte 类型
            if (field.getType().getName().equals("java.lang.Byte")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Byte value = (Byte)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //9. Character 类型
            if (field.getType().getName().equals("java.lang.Character")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Character value = (Character)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //10. Date 类型
            if (field.getType().getName().equals("java.util.Date")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                Date value = (Date)m.invoke(object);
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                if(!ObjectUtils.isEmpty(value))val = sdf.format(value);
            }
            //11. BigDecimal 类型
            if (field.getType().getName().equals("java.math.BigDecimal")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                BigDecimal value = (BigDecimal)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //12. List 类型
            if (field.getType().getName().equals("java.util.List")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                List value = (List)m.invoke(object);
                if(!ObjectUtils.isEmpty(value))val = value+"";
            }
            //13. LocalDate 类型
            if (field.getType().getName().equals("java.time.LocalDate")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                LocalDate value = (LocalDate)m.invoke(object);
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                if(!ObjectUtils.isEmpty(value))val = formatter.format(value);
            }
            //14. LocalTime 类型
            if (field.getType().getName().equals("java.time.LocalTime")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                LocalTime value = (LocalTime)m.invoke(object);
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
                if(!ObjectUtils.isEmpty(value))val = formatter.format(value);
            }
            //15. LocalDateTime 类型
            if (field.getType().getName().equals("java.time.LocalDateTime")) {
                Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
                LocalDateTime value = (LocalDateTime)m.invoke(object);
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                if(!ObjectUtils.isEmpty(value))val = formatter.format(value);
            }
        }catch (Exception e){}
        return val;
    }

    //拼接 参数实体get请求   属性值  首字母大写
    private String getMethodName(String fieldName) throws Exception{
        byte[] items = fieldName.getBytes();
        items[0] = (byte)((char)items[0]-'a'+'A');
        return new String(items);
    }

    /**
     * 切割大括号中的数据
     * @return
     */
    private List<String> getBraces(String str){
        List<String> strArr = null;
        try {
            strArr = new ArrayList<>(Arrays.asList(str.split("\\{")));
            strArr.remove(0);
            strArr = strArr.stream().map(s -> s.substring(0, s.indexOf("}"))).collect(Collectors.toList());
        }catch (Exception e){
            e.printStackTrace();
        }
        return strArr;
    }
}

谢谢点赞