解决SpringBoot在使用AOP切片时DATE类型出现Argument is not assignable to ‘lombok.Data‘ 的问题

场景:在使用aop切片时,里面的自动赋值给updateTime的时候报错 

(ps:学习AOP相关知识请参考:SpringBoot的特性之一:AOP-CSDN博客

以下是报错信息:

06-05 11:39:19 INFO  : <===== AutoInsert start =====>
06-05 11:39:19 INFO  : <===== AutoInsert Type:UPDATE =====>
06-05 11:39:19 ERROR : <===== AutoInsert error =====>
06-05 11:39:19 ERROR : 全局异常信息 ex=java.lang.NoSuchMethodException: com.ycg.vue.Entity.UserEntity.setUpdateTime(lombok.Data)
06-05 11:39:19 WARN  : Resolved [java.lang.RuntimeException: java.lang.NoSuchMethodException: com.ycg.vue.Entity.UserEntity.setUpdateTime(lombok.Data)]

以下是本人aop原代码片段:

case UPDATE: {
  log.info("<===== AutoInsert Type:UPDATE =====>");
  entity.getClass().getDeclaredMethod(AspectConstant.SET_UPDATE_BY, String.class).invoke(entity, ThreadLocalContext.getUserId());
  entity.getClass().getDeclaredMethod(AspectConstant.SET_UPDATE_TIME, Date.class).invoke(entity, now);
  break;
}

 报错和提示大概是说,无法映射到date这个类,查阅大量资料无果后开始一点点排查,先是去实体类中手写了一个set方法还是不行,然后就发现,反射的实体类字段的类型我写的是Date.class,我就想是不是因为有好几个Date类,所以不知道映射哪一个,然后我就把类改成了jdk的,也就是:java.util.Date.class。

case UPDATE: {
  log.info("<===== AutoInsert Type:UPDATE =====>");
  entity.getClass().getDeclaredMethod(AspectConstant.SET_UPDATE_BY, String.class).invoke(entity, ThreadLocalContext.getUserId());
  entity.getClass().getDeclaredMethod(AspectConstant.SET_UPDATE_TIME, java.util.Date.class).invoke(entity, now);
  break;
}

完美解决,其实这时候我才发现,没改之前把鼠标放上去还出现了Argument is not assignable to 'lombok.Data' 的提示,正好也跟上面吻合,我太爱(tao yan)反射了,看来还是不够细心,还需努力啊!

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中使用AOP的步骤如下: 1. 定义面 在Spring Boot中,可以使用`@Aspect`注解定义面类。例如: ```java @Aspect @Component public class MyAspect { @Before("execution(* com.example.demo.service.UserService.*(..))") public void beforeMethod(JoinPoint joinPoint) { System.out.println("方法执行前:" + joinPoint.getSignature().getName()); } @After("execution(* com.example.demo.service.UserService.*(..))") public void afterMethod(JoinPoint joinPoint) { System.out.println("方法执行后:" + joinPoint.getSignature().getName()); } } ``` 在上面的示例中,我们定义了一个名为`MyAspect`的面类,并使用`@Before`和`@After`注解定义了两个方法。这两个方法分别在目标方法执行前和执行后输出日志。`execution(* com.example.demo.service.UserService.*(..))`表示拦截`com.example.demo.service.UserService`类中的所有方法。 2. 启用AOP 在启动类上添加`@EnableAspectJAutoProxy`注解,启用AOP功能。例如: ```java @SpringBootApplication @EnableAspectJAutoProxy public class MyApp { // ... } ``` 3. 在目标方法上使用注解 在需要拦截的方法上添加注解。例如: ```java @Service public class UserService { @MyAnnotation public void addUser(User user) { // ... } public void deleteUser(int id) { // ... } } ``` 在上面的示例中,我们在`addUser()`方法上添加了`@MyAnnotation`注解,表示该方法需要被拦截。而`deleteUser()`方法没有被添加注解,不会被拦截。 当程序运行时,如果调用了带有`@MyAnnotation`注解的方法,面中定义的`beforeMethod()`方法和`afterMethod()`方法就会被执行,输出相应的日志。 需要注意的是,面类和注解都应该被扫描到。可以使用`@ComponentScan`注解指定需要扫描的包。例如: ```java @SpringBootApplication @ComponentScan(basePackages = {"com.example.demo.aspect", "com.example.demo.service"}) @EnableAspectJAutoProxy public class MyApp { // ... } ``` 这样,Spring Boot就会自动扫描`com.example.demo.aspect`和`com.example.demo.service`两个包下的类,并将其应用到目标方法上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值