当前位置: 首页 > 知识库问答 >
问题:

如何在Spring crud存储库方法上实现方面

蒲昊
2023-03-14

我正在做一个项目,我们有很多实体,我们将在这些实体上进行CRUD操作。我创建了一个基本实体类,在所有其他实体中,我扩展了基本实体类,该类具有诸如created\u date、created\u by、last\u updated\u date、last\u updated\u by等公共字段。现在,我想在Spring CrudRepository方法上实现aspect,并在保存时设置上述字段。

我尝试过实现类似的东西,但没有成功。

package com.cerium.aop;

import java.util.Date;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.cerium.datamodel.AccountDataModel;
import com.cerium.domain.Account;
import com.cerium.domain.BaseEntity;
import com.cerium.util.Constants;

/**
 * @author Manikanta B Cerium
 *
 */
@Component
@Aspect
public class SampleAspect {

    private static final Logger LOG = LoggerFactory.getLogger(SampleAspect.class);

    @Around("execution(* com.cerium.repository.*.save (com.cerium.domain.BaseEntity)) && args(saveData)")
    public Object beforeSave(ProceedingJoinPoint proceedingJoinPoint, Object saveData) throws Throwable {

        LOG.debug("Into aspect before save: {}", saveData);

        BaseEntity baseEntity = (BaseEntity) proceedingJoinPoint.proceed(new Object[] { saveData });

        // set the fields here......
        baseEntity.setCreatedDate(new Date());

        System.out.println(saveData);

        return baseEntity;

    }
}

共有1个答案

傅嘉悦
2023-03-14

要使用方面,我们应该首先使用过滤器表达式定义一个切入点方法(在您的情况下是“保存”方法),然后创建一个方法来处理此切入点:

@Component
@Aspect
public class CommonSaveAspect {

    @Pointcut("execution(* com.cerium.repository.*.save(..))")
    public void commonSave() {
    }

    @Around("commonSave()")
    public Object addCommonData(final ProceedingJoinPoint pjp) throws Throwable {

        Object[] args = pjp.getArgs();

        if (Iterable.class.isAssignableFrom(args[0].getClass())) {
            //noinspection unchecked
            Iterable<BaseEntity> entities = (Iterable<BaseEntity>) args[0];
            entities.forEach(entity -> {
                // set the fields here...
            });
        }

        if (args[0] instanceof BaseEntity) {
            BaseEntity entity = (BaseEntity) args[0];
            // set the fields here...
        }

        return pjp.proceed(args); 
    }
}

更多信息

 类似资料:
  • 假设我想有一个方法,它是获得超级主要客户,它有。 其中声明了方法。 然后我的公开存储库界面变成以下内容: 它扩展了和my。 我写的 bot不知道,在实现中写什么。如何接触客户?

  • 问题内容: 我在项目中使用Spring Data JPA仓库已有一段时间了,我知道以下几点: 在存储库接口中,我们可以添加类似的方法(假设和是域对象中的字段)。 然后,Spring通过在运行时(在应用程序运行期间)实现上述存储库接口方法来提供实现。 我对它的编码方式很感兴趣,并查看了Spring JPA源代码和API,但是找不到以下问题的答案: 如何在运行时生成存储库实现类以及如何实现和注入方法?

  • 它警告我,@Autowired在静态方法上是不允许的。当执行时,它给出null异常。我读过这个不能在Spring Boot应用程序的主方法中使用@Autowired JPA存储库 但它没有给出我如何做到这一点的任何信息。我不想使用属性文件。

  • 使用laravel 7/livewire应用程序,我使用Repository制作crud,并获得了数据列表,在装载事件中,我分配了受保护的var$FacilityRepository,它在render方法中正常工作, 但在编辑方法中为空,我得到错误: 当用户单击“编辑链接”时 在模板中,编辑链接定义为: 为什么会出现错误以及如何修复? 修改#2: > 类设施扩展组件{...公共$FacilityR

  • 本文向大家介绍Oracle数据库部分迁至闪存存储的实现方法,包括了Oracle数据库部分迁至闪存存储的实现方法的使用技巧和注意事项,需要的朋友参考一下 环境:Oracle 11.2.0.4 RAC(2 nodes) 说明:假设新增闪存挂载点是/flash(使用了第三方的集群文件系统),如果是使用Oracle的ASM,则本文提及的所有/flash目录都可以认定是新的闪存磁盘组是+FLASH。 1 实

  • 我正在一个大型laravel应用程序中实现存储库模式。我已经将几乎所有复杂的和可重用的数据库逻辑放在这些模型存储库中,我觉得它很有用,而且更有条理。所有实体创建、检索等代码现在都位于这些存储库中。 但是我的困惑是:我应该如何处理自定义雄辩的方法,例如,我有一个模型,其中包含诸如