2016-05-23 62 views
5

环境:弹簧数据mongodb的截距查询和注入谓词或规范

弹簧数据蒙戈:1.7.0.RC1 蒙戈-java的驱动程序:3.2.2

文献:

@Document(collection = "products") 
public class Product { 

    @Id 
    private String sid; 

    private String name; 

    private Long vendor; 

    (...) 
} 

库:

public interface ProductRepository extends MongoRepository<Product, String> { 

    Product findByName(String productName); 

} 

我的果阿l将拦截在Product集合上执行的任何查询,并添加谓词或规范,而不修改存储库或实现方法findByNameAndBelongsToVendorList。

我需要这个拦截器还是AspectJ,因为我有多种方法,如:

Page<Product> findAll(Pageable page); 

List<Product> findByCategory(String category, Pageable pageRequest); 

(...) 

目标

findByName // perform a filter by name (explicit) 
      // and a filter by vendor (injected via inteceptor or aspecJ) 

避免这样做

@Repository 
public class ProductRepositoryCustomImpl implements ProductRepositoryCustom { 

    @Autowired 
    private MongoTemplate template; 

    public Product findByNameAndBelongsToVendorList(String name, List<Long> vendors, Pageable pageRequest) { 

     Criteria criteriaVendor = Criteria.where("vendors").in(vendors); 
     Query query = new Query(criteriaVendor); 
     query.with(pageRequest); 

     return template.findOne(query, Product.class); 
    } 
} 

回答

0

方面应该做的招。

@Aspect 
public class YourAspect { 

    @Autowired 
    private MongoTemplate template; 

    @Pointcut("execution(public * findByName(..))") 
    private void findByName() { 
    } 

    @Pointcut("within(com.leonel.repository.ProductRepository)") 
    private void repository() { 
    } 

    @Around("repository() && findByName()") 
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable { 
     Object[] args = pjp.getArgs(); 
     String name = (String) args[0]; 

     Criteria newCriteria = YOUR NEW LOGIC HERE; 
     Query query = new Query(newCriteria); 

     return template.find(query, Your.class); 
    } 

我会建议反对不过,因为它引入了一点魔力,将代码和操作查询不应该是各方面关心的问题。 您想避免在您的存储库中有多个找到方法的原因是什么?

+0

目前我使用2个框架... SpringData e MongoTemplate。使用MongoTemplate,我可以在* org.springframework.data.mongodb.core *上使用切入点,并拦截所有方法,比如findAll,findOne ...但是对于SpringData我不知道该怎么做。 – Leonel