工作需求:在已有的项目中 增加操作日志功能, 要求 操作记录详细到 具体字段的修改,可指定具体需要记录的字段。
工作分三步走:
第一,增加自定义注解,确定拦截数据的格式。
第二:增加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;
}
}
谢谢点赞