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

时间:2015-03-09 15:08:02

标签: spring rest spring-boot spring-data-rest

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

我的问题

我如何在Spring Data存储库中自定义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&#39; ressource_url / id&#39;被叫。

提前致谢

1 个答案:

答案 0 :(得分:1)

您是否尝试使用@RestResource(exported = false)删除(id)方法?

我刚刚创建了一个简单的项目,它似乎有效。

以下是我项目中的存储库类的代码

public interface ProductRepository extends PagingAndSortingRepository<Product, Long> {
    @RestResource(exported = false)
    @Override
    void delete(Long var1);

    @Override
    void delete(Product var1);
}