在 Spring 数据存储库中自定义 DELETE 方法

Customize DELETE method in Spring Data repository

出于某些日志目的,我使用 AspectJ 来记录 CRUD 操作,对于删除操作,我仅支持 repository.delete(object),因此不支持 repository.delete(id),但在使用 http DELETE 调用时在 Spring 数据存储库中,我拦截 repository.findOne() 然后 repository.delete(id) 调用。

我的问题

我如何在 Spring 数据存储库中自定义 Http DELETE 方法以调用 repository.delete(object) 而不是 repository.delete(id)

这是存储库界面:

package com.geopro.repositories;

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

import com.geopro.entities.Product;

@RepositoryRestResource(collectionResourceRel = "product", path = "product")
public interface ProductRepository extends PagingAndSortingRepository<Product, Long> {

}

AspectJ 代码:

@Pointcut("execution(public * org.springframework.data.repository.Repository+.*(..))")
public void publicNonVoidRepositoryMethod() {
}

@Around("publicNonVoidRepositoryMethod()")
public Object publicNonVoidRepositoryMethod(ProceedingJoinPoint pjp) throws Throwable {

    if (pjp.getArgs()[0].getClass().getName() == "java.util.Arrays$ArrayList"  || pjp.getArgs()[0].getClass().getName() == "java.util.LinkedList") {
        Iterable arr = (Iterable) pjp.getArgs()[0];
        return saveHistoriqueOperation2(pjp, arr);
    } else {
        Object objs = pjp.getArgs()[0];
        if (objs.getClass().getName() == "com.geopro.entities.HistOperation") {
            Object o = pjp.proceed();
            return o;
        }
        return saveHistoriqueOperation(pjp, objs);
    }

}

我正在处理 objs 是实体对象的情况,所以我所有的删除操作都使用 delete(entity_object),而不是 delete(id),我正在寻找一种修改方式调用 http DELETE 'ressource_url/id' 的函数调用。

提前致谢

你试过在 delete(id) 方法上使用 @RestResource(exported = false) 吗?

我刚刚创建了一个简单的项目,它似乎可以工作。

这是我项目

中存储库class的代码
public interface ProductRepository extends PagingAndSortingRepository<Product, Long> {
    @RestResource(exported = false)
    @Override
    void delete(Long var1);

    @Override
    void delete(Product var1);
}