AOP统一处理(创建人、创建时间、修改人、修改时间、是否删除)

创建自定义注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Dal {
    /**
     *操作
     */
    String operation()  default "";
}

定义切面类

@Aspect
@Component
public class DalAspect {
    private static final String CREATEDDATE = "CREATEDDATE";
    private static final String CREATEDPERSON = "CREATEDPERSON";
    private static final String UPDATEDDATE = "UPDATEDDATE";
    private static final String UPDATEDPERSON = "UPDATEDPERSON";
    private static final String ISDELETE = "ISDELETE";
    private static final Logger logger = LoggerFactory.getLogger(DalAspect.class);
    @Pointcut("@annotation(com.xx.annotation.Dal)")
    public void operationPointCut() {
    }
    @Before("operationPointCut()")
    public void around(JoinPoint point) throws Throwable {
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        Dal dal = method.getAnnotation(Dal.class);
        if ("CREATE".equals(dal.operation())) {
            beforeInsert(point);
        } else {
            beforeUpdate(point);
        }
    }
    public void beforeInsert(JoinPoint point) {
        Object[] args = point.getArgs();
        if (args != null && args.length > 0) {
            Object argument = args[0];
            BeanWrapper beanWrapper = new BeanWrapperImpl(argument);
            //设置创建时间和修改时间
            if (beanWrapper.isWritableProperty(CREATEDDATE)) {
                beanWrapper.setPropertyValue(CREATEDDATE, new Date());
            }
            if (beanWrapper.isWritableProperty(UPDATEDDATE)) {
                beanWrapper.setPropertyValue(UPDATEDDATE, new Date());
            }
            //设置创建人和修改人
            if (beanWrapper.isWritableProperty(CREATEDPERSON) && StringUtils.isNotEmpty(ShiroUtils.getUserId())) {
                beanWrapper.setPropertyValue(CREATEDPERSON, ShiroUtils.getUserId());
            }
            if (beanWrapper.isWritableProperty(UPDATEDPERSON) && StringUtils.isNotEmpty(ShiroUtils.getUserId())) {
                beanWrapper.setPropertyValue(UPDATEDPERSON, ShiroUtils.getUserId());
            }
            //设置是否删除
            if (beanWrapper.isWritableProperty(ISDELETE)) {
                beanWrapper.setPropertyValue(ISDELETE, "0");
            }
            logger.info("After insert = {}", ToStringBuilder.reflectionToString(argument, ToStringStyle.SHORT_PREFIX_STYLE));
        }
    }
    public void beforeUpdate(JoinPoint point) {
        Object[] args = point.getArgs();
        if (args != null && args.length > 0) {
            Object argument = args[0];
            //如果参数是map类型
            if (argument instanceof Map) {
                Map map = (Map) argument;
                map.put(UPDATEDDATE, new Date());
                if (StringUtils.isNotBlank(ShiroUtils.getUserId())) {
                    map.put(UPDATEDPERSON, ShiroUtils.getUserId());
                }
            } else {
                BeanWrapper beanWrapper = new BeanWrapperImpl(argument);
                //设置修改时间
                if (beanWrapper.isWritableProperty(UPDATEDDATE)) {
                    beanWrapper.setPropertyValue(UPDATEDDATE, new Date());
                }
                //设置修改人
                if (beanWrapper.isWritableProperty(UPDATEDPERSON) && StringUtils.isNotBlank(ShiroUtils.getUserId())) {
                    beanWrapper.setPropertyValue(UPDATEDPERSON, ShiroUtils.getUserId());
                }
            }
            logger.info("After update = {}", ToStringBuilder.reflectionToString(argument, ToStringStyle.SHORT_PREFIX_STYLE));
        }
    }
}

在相应的方法上加上@Dal(operation = “CREATE”)或@Dal即可动态设置

@PostMapping("/save")
@Dal(operation = "CREATE")
public R save(@RequestBody SysDict dict){
    ......
    return R.ok();
}
 
@PutMapping("/update")
@Dal
public R update(@RequestBody SysDict dict){
    ......
    return R.ok();
}
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在实体类中,我们可以使用注解和AOP等方式来实现自动给公共字段赋值的功能。下面是一个示例: ```java import java.util.Date; public class BaseEntity { private Long id; private String createBy; private Date createTime; private String updateBy; private Date updateTime; // 在实体类持久化之前,自动设置createBy、createTime、updateBy、updateTime @PrePersist public void prePersist() { createTime = updateTime = new Date(); createBy = updateBy = "system"; } // 在实体类更新之前,自动设置updateBy、updateTime @PreUpdate public void preUpdate() { updateTime = new Date(); updateBy = "system"; } // 省略getter和setter方法 } ``` 上述代码中,使用了JPA提供的注解 `@PrePersist` 和 `@PreUpdate` 标注了 `prePersist()` 和 `preUpdate()` 方法,这两个方法在实体类被持久化前和更新前自动调用。在这两个方法中,我们可以编写代码来实现自动给公共字段赋值的功能。 在 `prePersist()` 方法中,我们使用 `new Date()` 方法来获取当前时间,并将其赋值给 `createTime` 和 `updateTime` 字段。同时,我们将 `createBy` 和 `updateBy` 字段赋值为 "system",表示是系统自动创建和更新的。 在 `preUpdate()` 方法中,我们同样使用 `new Date()` 方法来获取当前时间,并将其赋值给 `updateTime` 字段。同时,我们将 `updateBy` 字段赋值为 "system",表示是系统自动更新的。 需要注意的是,上述代码中的字段和默认值都是示例,具体情况需要根据实际需求进行调整。同时,如果需要自动获取当前登录用户信息,可以使用AOP等方式来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值